Почему UITextField анимируется на resignFirstResponder?
Так как iOS 8, UITextFields в форме ведут себя очень странно. Если я нажму на другое текстовое поле или нажмите "Tab" на клавиатуре, введенный текст будет анимироваться вверх, а затем снова появится. Это происходит каждый раз после того, как представление загрузилось, и время от времени.
Он выглядит следующим образом:
![Анимация]()
Мой код выглядит следующим образом:
#pragma mark - <UITextFieldDelegate>
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if (textField == self.passwordTextField) {
[self loginButtonClicked:nil];
} else if (textField == self.emailTextField) {
[self.passwordTextField becomeFirstResponder];
}
return YES;
}
EDIT:
Похоже, эта проблема вызвана моими слушателями клавиатуры:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
- (void)keyboardWillHide:(NSNotification *)sender
{
self.loginBoxBottomLayoutConstraint.constant = 0;
[self.view layoutIfNeeded];
}
- (void)keyboardWillShow:(NSNotification *)sender
{
CGRect frame = [sender.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect newFrame = [self.view convertRect:frame fromView:[[UIApplication sharedApplication] delegate].window];
self.loginBoxBottomLayoutConstraint.constant = CGRectGetHeight(newFrame);
[self.view layoutIfNeeded];
}
Ответы
Ответ 1
Проблема заключается в том, что вы выполняете кусок кода в
-(void)keyboardWillShow:(NSNotification *)sender
даже если клавиатура уже активна, что приводит к некоторым искажениям.
Небольшая работа вокруг будет проверять, активна ли клавиатура до настройки кадров, как показано ниже
bool isKeyboardActive = false;
-(void)keyboardWillHide:(NSNotification *)sender
{
self.boxBottomConstraint.constant = 0;
[self.view layoutIfNeeded];
isKeyboardActive = false;
}
-(void)keyboardWillShow:(NSNotification *)sender
{
if (!isKeyboardActive) {
CGRect frame = [sender.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect newFrame = [self.view convertRect:frame fromView:[[UIApplication sharedApplication] delegate].window];
self.boxBottomConstraint.constant = CGRectGetHeight(newFrame);
[self.view layoutIfNeeded];
isKeyboardActive = true;
}
}
Ответ 2
Попробуйте это
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[textField layoutIfNeeded];
}
Я думаю, это должно решить вашу проблему. Получил аналогичную запись в UITextField: при начале ввода текстовое поле отскакивает вверх, а затем отскакивает вниз
Текст IOS8 в TextField Bounces on Focus
Дайте мне знать, если еще проблема
Ответ 3
Попробуйте обернуть код в этом
[UIView performWithoutAnimation:^{
// Changes we don't want animated here
}];