переместите UIToolbar вверх

У меня есть UIToolbar в конце моего представления, и у меня есть UITextField на этой панели инструментов. Когда я начинаю редактировать это поле, оно скрыто позади клавиатуры. Для наблюдения, что я ввел я хочу переместить панель инструментов вверх в данный момент, клавиатура представлена (и затем положите обратно ее вниз, когда я закончил редактировать).

Как я перемещаю этот UIToolbar/вниз?

9
задан Maple 15 October 2013 в 15:12
поделиться

3 ответа

добавьте класс viewController в список наблюдателей UIKeyboardWillShowNotification/UIKeyboardWillHideNotification. затем вы можете переместить ваш вид, чтобы сделать ваш текстовый просмотр видимым. Вы также можете получить параметры анимации из этого уведомления, чтобы синхронизировать вашу анимацию с параметрами клавиатурной анимации текущей версии операционной системы. этот код я использовал для paging

- (void) viewWillAppear:(BOOL)animated{
 [супер видВиллАппиар:анимация];
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(liftMainViewWhenKeybordAppears:) name:UIKeyboardWillShowNotification object:nil];
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector:@selector(returnMainViewToInitialposition:) name:UIKeyboardWillHideNotification object:nil];
}
- (void) viewWillDisappear:(BOOL)animated{
 [super viewWillDisappear:animated];
 [[NSNotificationCenter defaultCenter] removeObserver:self];
}

в методах ниже я установил два метода для обработки клавиатурных уведомлений. и вот эти методы:

- (void) liftMainViewWhenKeybordAppears:(NSNotification*)aNotification{
 NSD словарь* userInfo = [aNotification userInfo];
 NSTimeInterval анимацияДурация;
 UIViewAnimationCurve animationCurve;
 CGRect keyboardFrame;
 [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
 [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
 [[userInfo objectForKey:UIKeyboardBoundsUserInfoKey] getValue:&keyboardFrame];
 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:animationDuration];
 [UIView setAnimationCurve:animationCurve];
 [self.view setFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y - keyboardFrame.size.height, self.view.frame.size.width, self.view.frame.size.height)];
 [UIView commitAnimations];
}
- (void) returnMainViewToInitialposition:(NSNotification*)aNotification{
    NSDictionary* userInfo = [aNotification userInfo];
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardFrame;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardBoundsUserInfoKey] getValue:&keyboardFrame];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];
    [self.view setFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y + keyboardFrame.size.height, self.view.frame.size.width, self.view.frame.size.height)];
    [UIView commitAnimations];
}
13
ответ дан 4 December 2019 в 07:47
поделиться

Спасибо, что сработало! Вот небольшое улучшение:

- (void) liftMainViewWhenKeybordAppears:(NSNotification*)aNotification{
    [self scrollViewForKeyboard:aNotification up:YES];
}

- (void) returnMainViewToInitialposition:(NSNotification*)aNotification{
    [self scrollViewForKeyboard:aNotification up:NO];
}

- (void) scrollViewForKeyboard:(NSNotification*)aNotification up: (BOOL) up{
    NSDictionary* userInfo = [aNotification userInfo];

    // Get animation info from userInfo
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardFrame;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardBoundsUserInfoKey] getValue:&keyboardFrame];

    // Animate up or down
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];

    [self.view setFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y + (keyboardFrame.size.height * (up?-1:1)), self.view.frame.size.width, self.view.frame.size.height)];
    [UIView commitAnimations];
}
8
ответ дан 4 December 2019 в 07:47
поделиться

Большое спасибо за это; это отлично работает. Однако, код в представленном виде имеет 2 ограничения, с которыми я столкнулся:

1) Перемещаемый вид просто выезжает за пределы экрана, а не изменяет размер, чтобы соответствовать пространству, доступному после появления клавиатуры

2) Повторные уведомления из-за переключения текстовых полей продолжают применять изменение рамки, что приводит к постепенному выезду вида за пределы экрана.

Причина в том, что вышеописанное является перепозиционированием относительно текущего кадра представления, а не изменением размера относительно клавиатуры. Вот две измененные строки кода, которые исправляют это:

В liftMainViewWhenKeybordAppears:, изменить размер, а не позиционировать относительно клавиатуры:

    keyboardFrame = [self.view.window convertRect:keyboardFrame toView:self.view.superview];
    CGRect superviewFrame = [self.view.window convertRect:self.view.superview.frame toView:self.view];
    [self.view setFrame:CGRectMake(self.view.frame.origin.x, 
                               self.view.frame.origin.y,
                               self.view.frame.size.width, 
                               superviewFrame.size.height - keyboardFrame.size.height)];

В returnMainViewToInitialposition:, изменить анимацию на этот setFrame: (по сути это похоже на преобразование идентичности).

    [self.view setFrame:CGRectMake(self.view.frame.origin.x, 
                               self.view.frame.origin.y,
                               self.view.frame.size.width, 
                               keyboardFrame.origin.y + keyboardFrame.size.height)];
2
ответ дан 4 December 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: