UIKit отправляет UIKeyboardWillShowNotification
, когда показывает клавиатуру, и UIKeyboardWillHideNotification
, когда скрывает клавиатуру.Эти уведомления содержат все, что вам нужно для правильной анимации вашего UITextField
.
Допустим, ваш UITextField
находится в свойстве под названием myTextField
.
Сначала вам нужно зарегистрироваться дляуведомления где-то.То, где вы регистрируетесь, зависит от того, какой объект отвечает за перемещение myTextField
.В моем проекте ответственным является супервизор поля, и поскольку я загружаю свой пользовательский интерфейс из пера, я делаю это в суперпредставлении awakeFromNib
:
- (void)awakeFromNib
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideOrShow:) name:UIKeyboardWillHideNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideOrShow:) name:UIKeyboardWillShowNotification object:nil];
}
Если вы используете UIViewController
для перемещения полявы, вероятно, захотите сделать это в viewWillAppear:animated:
.
Вы должны отменить регистрацию в вашем dealloc
или viewWillDisappear:animated:
:
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
Конечно, хитрый бит вметод keyboardWillHideOrShow:
.Сначала я извлекаю параметры анимации из уведомления:
- (void)keyboardWillHideOrShow:(NSNotification *)note
{
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrame
находится в глобальной системе координат.Мне нужно преобразовать кадр в ту же систему координат, что и myTextField.frame
, а myTextField.frame
находится в системе координат myTextField.superview
:
CGRect keyboardFrameForTextField = [self.myTextField.superview convertRect:keyboardFrame fromView:nil];
Далее я вычисляю нужный кадр myTextField
перейти к.Нижний край нового кадра должен быть равен верхнему краю кадра клавиатуры:
CGRect newTextFieldFrame = self.myTextField.frame;
newTextFieldFrame.origin.y = keyboardFrameForTextField.origin.y - newTextFieldFrame.size.height;
Наконец, я анимирую myTextField
к его новому кадру, используя те же параметры анимации, что и клавиатура:
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
self.myTextField.frame = newTextFieldFrame;
} completion:nil];
}
Здесь все собрано вместе:
- (void)keyboardWillHideOrShow:(NSNotification *)note
{
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardFrameForTextField = [self.myTextField.superview convertRect:keyboardFrame fromView:nil];
CGRect newTextFieldFrame = self.myTextField.frame;
newTextFieldFrame.origin.y = keyboardFrameForTextField.origin.y - newTextFieldFrame.size.height;
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
self.myTextField.frame = newTextFieldFrame;
} completion:nil];
}