为什么UITextField在resignFirstResponder上设置动画?

gkl*_*lka 15 animation objective-c uitextfield ios resignfirstresponder

从iOS 8开始,表单中的UITextField表现得非常奇怪.如果我单击另一个文本字段或按键盘上的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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

看起来这个问题是由我的键盘监听器引起的:

[[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];
}
Run Code Online (Sandbox Code Playgroud)

小智 4

问题似乎是您正在执行以下代码段

-(void)keyboardWillShow:(NSNotification *)sender
Run Code Online (Sandbox Code Playgroud)

即使键盘已经处于活动状态,这也会导致一些失真。

一个小的解决方法是在调整框架之前检查键盘是否已经处于活动状态,如下所示

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;
    }
}
Run Code Online (Sandbox Code Playgroud)