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
собственность на них.