动画期间键盘和文本视图之间的间隙

Posted

技术标签:

【中文标题】动画期间键盘和文本视图之间的间隙【英文标题】:gap between keyboard and textview during animation 【发布时间】:2014-02-18 17:38:51 【问题描述】:

我想在键盘出现时调整文本视图的高度。在 ios 7 中,这可以通过调整视图控制器的 textview 和 bottomLayoutGuide 之间的 NSLayoutConstraint 来完成。

除了一个细节之外,下面的代码可以正常工作。在动画期间,文本视图在键盘之前运行,并且出现了很大的间隙。在keyboardWillHide 方法期间类似。

这个“错误”的原因可能是因为键盘从屏幕的最底部开始,而由于工具栏的高度,文本视图从更高的位置开始。

关于如何解决此问题的任何建议?

-(void) keyboardWillShow:(NSNotification *) notification

//update constraints
CGRect keyboardFrame = [[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect convertedKeyboardFrame = [[self view] convertRect:keyboardFrame
                                        fromView:nil];
CGRect toolbarFrame = [[[self navigationController] toolbar] frame];
CGRect convertedToolbarFrame = [[self view] convertRect:toolbarFrame
                                                fromView:nil];
CGFloat toolbarAdjustment = (UIInterfaceOrientationIsPortrait([self interfaceOrientation])) ? CGRectGetHeight(convertedToolbarFrame) :CGRectGetWidth(convertedToolbarFrame);

[[_textView bottomSpaceConstraint] setConstant:CGRectGetHeight(convertedKeyboardFrame) - toolbarAdjustment];


//animate change
for (UIView *view in [[self view] subviews])

    [view setNeedsUpdateConstraints];


[UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]
                      delay:0  //0.2 as possible hack, otherwise a gap appears between keyboard and textview
                    options:[[[notification userInfo] valueForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]
                 animations:^
                     for (UIView *view in [[self view] subviews])
                     
                         [view layoutIfNeeded];
                     

                 
                 completion:NULL];

【问题讨论】:

快速作弊以避免你的错误(甚至可能看起来很整洁):在抬起键盘之前让你的底栏动画离开屏幕。 【参考方案1】:

延迟可能是循环调用layoutIfNeeded造成的。

在动画块中,只需将layoutIfNeeded 发送到根视图,即self.view。将layoutIfNeeded 发送到根视图将处理整个视图层次结构。所以摆脱循环。

我怀疑是否有必要拨打setNeedsUpdateConstraints;如果是,则只需要发送到根视图即可。

另外,试着去掉动画选项参数

options:0

【讨论】:

合并您的评论后代码仍然有效。感谢您的改进。但问题仍然存在。并不是说有延迟。就是动画曲线和键盘不一样。文本视图将在键盘之前到达其目标点。 @user965972 用新想法更新了答案……消除动画选项。 不,没有区别。

以上是关于动画期间键盘和文本视图之间的间隙的主要内容,如果未能解决你的问题,请参考以下文章

自定义 inputView 在模态演示期间未正确设置动画

键盘隐藏另一个视图的文本字段动画

动画虚拟键盘

在文本视图之间切换时,不同的键盘高度会产生奇怪的框架

键盘附件视图隐藏文本

iOS 为啥将 ToolBar 间隙移至键盘