在 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 设置动画的主要内容,如果未能解决你的问题,请参考以下文章