我需要在即将开始的项目中添加聊天功能。
与此同时,我一直在尝试实现我所期望的简单问题,即在屏幕底部有一个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];
}
有没有其他人做过相似的事情,能够为我提供更好的解决方案吗?
答案 0 :(得分:8)
这对我有用:
- (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) {
...
}];
}
答案 1 :(得分:5)
通知userInfo词典包含动画持续时间(UIKeyboardAnimationDurationUserInfoKey
)和曲线(UIKeyboardAnimationCurveUserInfoKey
)信息;如果你使用两者,你的动画应该与键盘动画时间匹配。