Почему 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
}];