У меня есть UIToolbar в конце моего представления, и у меня есть UITextField на этой панели инструментов. Когда я начинаю редактировать это поле, оно скрыто позади клавиатуры. Для наблюдения, что я ввел я хочу переместить панель инструментов вверх в данный момент, клавиатура представлена (и затем положите обратно ее вниз, когда я закончил редактировать).
Как я перемещаю этот UIToolbar/вниз?
добавьте класс 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];
}
Спасибо, что сработало! Вот небольшое улучшение:
- (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];
}
Большое спасибо за это; это отлично работает. Однако, код в представленном виде имеет 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)];