用键盘动画UIView

我需要在即将开始的项目中添加聊天function。

与此同时,我一直在尝试实现我所期望的简单问题,即在屏幕底部有一个UIVeiew,里面有一个UITextView,当用户点击UITextView时,它会用键盘设置动画。

我有它工作,但不幸的是键盘的动画略微落后于它上面的视图。 这是我到目前为止的实现:

注册键盘通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 

键盘通知方法:

 - (void)keyboardWillShow:(NSNotification*)notification { CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]; NSInteger curve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; [UIView animateWithDuration:duration delay:0 options:curve animations:^{ CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; _chatViewBottomConstraint.constant = keyboardFrame.size.height; [self.view layoutIfNeeded]; } completion:nil]; } 

有没有其他人做过类似的事情,能够为我提供更好的解决方案吗?

这对我有用:

 - (void)keyboardWillShow:(id)keyboardDidShow { [UIView beginAnimations:nil context:NULL]; NSDictionary *userInfo = [keyboardDidShow userInfo]; [UIView setAnimationDuration:[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; [UIView setAnimationCurve:[userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]]; [self.view layoutIfNeeded]; [UIView commitAnimations]; } - (void)keyboardWillHide:(id)keyboardDidHide { [UIView beginAnimations:nil context:NULL]; NSDictionary *userInfo = [keyboardDidHide userInfo]; [UIView setAnimationDuration:[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; [UIView setAnimationCurve:[userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]]; [self.view layoutIfNeeded]; [UIView commitAnimations]; } 

更新:或者你可以用块做同样的事情:

 - (void)keyboardWillShow:(id)keyboardDidShow { NSDictionary *userInfo = [keyboardDidShow userInfo]; [UIView animateWithDuration:[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] delay:0.f options:[[keyboardDidShow userInfo][UIKeyboardAnimationCurveUserInfoKey] intValue] << 16 animations:^{ ... } completion:^(BOOL finished) { ... }]; } - (void)keyboardWillHide:(id)keyboardDidHide { NSDictionary *userInfo = [keyboardDidHide userInfo]; [UIView animateWithDuration:[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] delay:0.f options:[[keyboardDidHide userInfo][UIKeyboardAnimationCurveUserInfoKey] intValue] << 16 animations:^{ ... } completion:^(BOOL finished) { ... }]; } 

通知userInfo词典具有动画持续时间( UIKeyboardAnimationDurationUserInfoKey )和曲线( UIKeyboardAnimationCurveUserInfoKey )信息; 如果同时使用它们,则动画应与键盘动画时序相匹配。