【发布时间】:2017-06-15 10:38:21
【问题描述】:
我的UIViewController 中有一个普通的UITableView,被限制为全屏。这个 tableView 有一个自定义的交互式tableHeaderView。 tableHeaderView 的大小是动态的,并且会自行扩展。
headerView 有一个 textField,它会根据 textField 是否有焦点来改变自己的大小。
问题是屏幕底部的单元格在更改 tableHeaderView 的大小时并不总是正确动画。
我在动画块内的layoutIfNeeded() 之后调用tableView.beginUpdates() 和tableView.endUpdates()。必须这样做,否则单元格根本不会遵循动态大小。
我制作了这个 gif。在动画期间专门查看底部单元格。我已经大大放慢了动画的速度,所以很容易看出问题。
推测:在我看来,tableView 在动画开始时就调用cellForRow:indexPath:,并以某种方式找出整个 tableView 在动画之后将处于什么状态,并删除不必要的单元格,即使动画尚未完成。
同样,折叠标题时:最底部的单元格的动画方式与已加载的单元格不同。它们使用不同的动画进行动画处理..
为什么会这样?这可以预防吗?
编辑:动画代码
self.navigationController?.setNavigationBarHidden(isEditing, animated: true)
var frame = tableHeaderView.frame
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing)
UIView.animate(withDuration: 0.3, animations: {
if isEditing{
let point = CGPoint(x: 0, y: -self.topLayoutGuide.length)
self.tableView.setContentOffset(point, animated: false)
}
tableHeaderView.frame = frame
tableHeaderView.layoutIfNeeded()
self.view.layoutIfNeeded()
self.tableView.beginUpdates()
self.tableView.endUpdates()
}) { [weak self](completed:Bool) in
//Do stuff
}
【问题讨论】:
-
你能显示代码吗?
-
在故事板中-选择场景->显示属性检查器->在顶栏下,在顶栏下取消勾选。
-
@Sti : 使用应该共享一些代码。
-
@jalone 没有太多可显示的代码,但我已经更新了一些问题。
-
@Poles 问题中添加了一点动画代码
标签: ios uitableview uiview uiviewanimation