我的应用程序是用SWIFT2.0编写的,需要在iOS 8.1或更高版本上运行。我使用Xcode 7.0。
我正在使用一个标准的UITableViewController。我的UITableView只有一种定制的原型单元格CustomCell,它可以子类为UITableViewCell。CustomCell内部有一对UILabels,它们都有清晰的背景颜色和固定的宽度和高度。所有内容都在Interface中进行了布局。
我经常从另一个来源接收数据(10+时间/s)。我的单元格中的标签必须根据接收到的数据更新它们的内容。我也需要动画标签背景颜色。为此,我使用以下方法:
extension UIView {
func fadeOut() {
self.layer.backgroundColor = UIColor.blackColor().CGColor
UIView.animateWithDuration(2.0, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
self.layer.backgroundColor = UIColor.clearColor().CGColor
}, completion: nil)
}
}
我使用以下代码更新标签:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomCell
let oldText = customLabel.text
let newText = dataForLabels[indexPath.row].custom
if newText != oldText {
cell.customLabel.fadeOut()
}
cell.customLabel.text = dataForLabels[indexPath.row].custom
return cell
}
我的update (回调)方法如下所示:
var dataForLabels:[Int:(custom: String?, anotherCustom: String?)] = [:]
func updateData(CustomData data) {
for d in data {
dataForLabels[d.index] = (custom: data.custom, anotherCustom: data.anotherCustom)
}
tableView.reloadData()
}
现在,问题本身:
当特定单元格/标签的数据没有变化时,动画应该继续(衰落效应,2s)。当数据发生变化时,动画应该重新启动。
当我调用reloadData()时,数据没有变化,动画就被删除/停止,也就是说,标签的背景颜色突然变得清晰,没有褪色效果。
我尝试过将reloadData()分派到主线程,但是没有帮助。我尝试过使用CABasicAnimation而不是animateWithDuration(),但它也解决不了这个问题。
我尝试了一个类似的场景,但完全没有使用表(只使用几个UIViews而不是单元格),而且它可以工作。问题是当我使用reloadData()时。
我试过调试它,但在拆卸方面我不太好。我看到layout_if_needed()被调用了,所有的动画都被删除了。
我怀疑的是,当调用reloadData()时,布局管理器认为由于某种原因约束发生了变化,需要更新布局,这会破坏所有的动画。
这个问题有什么解决办法吗,最好是我可以继续使用Interface的解决方案?
任何帮助都将不胜感激。
发布于 2015-11-06 12:47:59
如果标签上的数据发生变化,则不需要重新加载表视图,只需更改标签上的文本即可。如果行数发生变化,或者需要重新创建单元格,则只需重新加载表视图。
只需使用tableView.indexPathsForVisibleRows获取可见行的索引路径,然后在可见单元格上迭代以更改文本或背景。
https://stackoverflow.com/questions/33570127
复制