动画期间键盘和文本视图之间的间隙
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 用新想法更新了答案……消除动画选项。 不,没有区别。以上是关于动画期间键盘和文本视图之间的间隙的主要内容,如果未能解决你的问题,请参考以下文章