在动画期间,iOS约束不能足够快地更新

时间:2013-09-13 20:15:15

标签: iphone ios objective-c uiview constraints

我的iOS屏幕底部有一个页脚UIView大约50像素高。在这个视图的加载阶段,我添加了一个子视图(比如说footer-subview),并以编程方式为所有边添加约束,常量为0(基本上覆盖了整个页脚视图)。

我注册了keyboardWillShow通知,并在其中我将约束更改为我的页脚视图(不要与上一段中提到的约束混淆),这只是一个控制外页脚视图位置的约束)所以它显示在键盘的正上方。从理论上改变这个约束应该改变所有相关的约束,特别是我的页脚 - 子视图的外边缘约束。

当键盘显示时,页脚视图可以很好地显示键盘的动画效果,但是页脚视图中我的页脚 - 子视图的约束会有一点延迟更新,这会给我带来难看的视觉效果。页脚空白一瞬间。

这是我的keyboardWillShowNotifcation

的代码
- (void)keyboardWillShow:(NSNotification *)notification
{
  _keyboardIsVisible = YES;
  CGRect keyboardSize;
  [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardSize];
  [UIView animateWithDuration:0.35f
                        delay:0
                      options:UIViewAnimationCurveLinear | UIViewAnimationOptionBeginFromCurrentState
                   animations:^{
                     [_footerTopSpaceConstraint setConstant:-1 * CGRectGetHeight(keyboardSize)];

                     [self.view layoutIfNeeded];
                   }
                   completion:nil];

}

有关如何更快地更新页脚 - 子视图约束的任何提示,以便它们的父级,页脚视图能够很好地生成动画?

1 个答案:

答案 0 :(得分:0)

不要害怕拨打setFrame:

- (void)keyboardWillShow:(NSNotification *)notification
{
    _keyboardIsVisible = YES;
    CGRect keyboardSize;
    [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardSize];
    [UIView animateWithDuration:0.35f
                          delay:0
                        options:UIViewAnimationCurveLinear|UIViewAnimationOptionBeginFromCurrentState
                     animations:^{

                         CGRect footerRect = [_myFooterView frame];
                         [_myFooterView setFrame:CGRectOffset(footerRect, 0, -CGRectGetHeight(keyboardSize))];
                     }
                     completion:^(BOOL finished) {

                         [_footerTopSpaceConstraint setConstant:-1 * CGRectGetHeight(keyboardSize)];
                         [self.view setNeedsUpdateConstraints];
                     }];
}