我试图通过在tableView函数内调用startAnimation()来动画化tableViewCell行的高度:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! TableViewCell
tableView.rowHeight = 44.0
startAnimation(tableView)
return cell
}
//MARK: Animation function
func startAnimation(tableView: UITableView) {
UIView.animateWithDuration(0.7, delay: 1.0, options: .CurveEaseOut, animations: {
tableView.rowHeight = 88.0
}, completion: { finished in
print("Row heights changed!")
})
}
结果:行高确实发生了变化,但没有发生任何动画。我不明白为什么动画不起作用。我应该在某个地方定义一些开始和结束状态吗?
最佳答案
不要那样改变高度。相反,当您知道要更改单元格的高度时,调用(在任何函数中):
self.tableView.beginUpdates()
self.tableView.endUpdates()
这些调用通知tableView检查高度变化。然后实现委托(delegate)
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
,并为每个单元格提供适当的高度。高度变化将自动设置动画。您可以为没有明确高度的物品返回UITableViewAutomaticDimension
。我不建议从
cellForRowAtIndexPath
内部执行此类操作,例如,在响应轻击didSelectRowAtIndexPath
的响应中进行操作。在我的一个类中,我做了:override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if indexPath == self.selectedIndexPath {
self.selectedIndexPath = nil
}else{
self.selectedIndexPath = indexPath
}
}
internal var selectedIndexPath: NSIndexPath? {
didSet{
//(own internal logic removed)
//these magical lines tell the tableview something's up, and it checks cell heights and animates changes
self.tableView.beginUpdates()
self.tableView.endUpdates()
}
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if indexPath == self.selectedIndexPath {
let size = //your custom size
return size
}else{
return UITableViewAutomaticDimension
}
}
关于swift - swift : How to animate the rowHeight of a UITableView?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37626282/