在UITableView上动画layoutIfNeeded,无需动画UITableViewCells

时间:2014-10-01 19:12:02

标签: ios objective-c uitableview uiview autolayout

我有一个UITableView,它是我的视图控制器的子视图。它位于屏幕的下半部分,可以使用手势识别器向上滚动。手势完成后,我调用UIView动画块,通过更改其顶部布局约束来完成UITableView的动画(请参阅下面的示例代码)。

动画本身工作正常,但我注意到UITableViewCell子视图显示的一个奇怪的副作用(查看视频 - 注意表视图底部单元格上的弹跳),看似由于layoutIfNeeded动画调用

有没有办法将layoutIfNeeded调用隔离到表视图而不是它的子视图?

代码:

- (void) handlePanRecognizer:(UIPanGestureRecognizer*)recognizer {
  if (recognizer.state == UIGestureRecognizerStateEnded) {
    self.topLayoutConstraint.constant = 0.0f;

  //Animate
  [UIView animateWithDuration:kAnimationDuration
                        delay:0.0F
       usingSpringWithDamping:kAnimationBounce
        initialSpringVelocity:kAnimationBounce
                      options:UIViewAnimationOptionCurveEaseInOut
                   animations:^{
                     [self layoutIfNeeded];
                   } completion:^(BOOL finished) {
                   }];

  }
}

视频: enter image description here

1 个答案:

答案 0 :(得分:0)

问题最终与自动布局约束有关。

我为表格视图设置了一个底部约束,因此其初始化高度远小于其全屏高度。在为顶部布局约束设置动画时,它会将表格视图拉伸到正确的大小,但是自动布局会奇怪地插入子视图约束(例如我的表视图单元格内容中的那些)。

解决方案是从表视图中删除底部布局约束,而是为视图赋予它相同的高度约束。