UITextField, теряющий firstResponder, возвращает анимации / модификации кадра

Я использую следующий код, чтобы изменить размер кадра, чтобы разместить / исчезнуть клавиатуру:

- (void)moveCodeViewForKeyboard:(NSNotification*)aNotification up:(BOOL)up {
    NSDictionary* userInfo = [aNotification userInfo];
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardEndFrame;

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];

    CGRect newFrame = codeView.frame;
    CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil];
    keyboardFrame.size.height += keyboardToolbar.frame.size.height;
    keyboardFrame.size.height += 10;
    newFrame.size.height -= keyboardFrame.size.height * (up?1:-1);
    codeView.frame = newFrame;

    [UIView commitAnimations];
}

Этот код повторяется для некоторых других подпредставлений, которые анимируются при отображении / скрытии клавиатуры.

При нажатии на UITextField все анимации отображаются правильно. Но если я сразу же коснусь UITextView, все элементы (UIToolbar, UITextView, UIWebView), которые были анимированы ранее, вернутся к своим исходным кадрам (позиции и размеру) и больше не будут анимироваться. Если я отклоню клавиатуру, когда UITextField имеет значение firstResponder, элементы вернутся к исходному кадру, но снова будут анимированы.

Очень странно...

Просто потому, что я думаю, что люди спросят:

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSLog(@"textFieldDidEndEditing");
}

Заранее спасибо!

1 ответ

Ваш проект настроен на использование? autolayout? Если это так, то ограничения создаются для вас автоматически, когда вы используете Interface Builder, и вам уже недостаточно просто изменять фреймы компонентов, вам нужно настроить ограничения, которые есть у этих компонентов. Обычно это делается путем привязки ограничений к IBOutlet свойства и изменить constant собственность на них.

Другие вопросы по тегам