在 UITableView 上为 layoutIfNeeded 设置动画而不为 UITableViewCells 设置动画

Posted

技术标签:

【中文标题】在 UITableView 上为 layoutIfNeeded 设置动画而不为 UITableViewCells 设置动画【英文标题】:Animating layoutIfNeeded on UITableView without animating UITableViewCells 【发布时间】:2014-10-01 19:12:01 【问题描述】:

我有一个 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) 
                   ];

  

视频:

【问题讨论】:

【参考方案1】:

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

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

解决方案是从 table view 中移除底部布局约束,而是给它一个与 view 相等的高度约束。

【讨论】:

以上是关于在 UITableView 上为 layoutIfNeeded 设置动画而不为 UITableViewCells 设置动画的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 动态单元格高度在过渡或旋转时中断

在 linux 上为 windows 编译

如何在 KMM 上为 SQLDelight 编写单元测试

为啥在反应历史 createHashHistory 上为每个路径附加 /#?

无法在 TestFlight 上为设备授予构建权限

如何在 iOS 8 上为 superview 制作 clearColor