动画期间键盘和textview之间的差距

时间:2014-02-18 17:38:51

标签: ios7 uiviewanimation uikeyboard nslayoutconstraint

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

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

这个"错误的原因"可能是因为键盘从屏幕的最底部开始,而textview由于工具栏的高度而开始更高。

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

-(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 个答案:

答案 0 :(得分:1)

延迟可能是由于在循环中反复调用layoutIfNeeded引起的。

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

我怀疑是否有必要调用setNeedsUpdateConstraints;如果是,则只需将其发送到根视图。

另外,请尝试删除动画选项参数

options:0