我的应用程序是用Swift 2.0编写的,需要在iOS 8.1或更高版本上运行。我使用Xcode 7.0。
我正在使用标准的UITableViewController。我的UITableView只有一种自定义原型单元CustomCell,它是UITableViewCell的子类。 CustomCell里面有几个UILabel,它们都有清晰的背景颜色和固定的宽度和高度。所有内容都在Interface Builder中进行了布局。
我经常从另一个来源收到数据(10次以上/秒)。我的单元格中的标签必须根据收到的数据更新其内容。我还需要为标签背景颜色设置动画。为此,我使用以下内容:
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
}
我的更新(回调)方法如下所示:
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 Builder?
非常感谢任何帮助。
答案 0 :(得分:1)
如果标签上的数据发生变化,则无需重新加载tableview,只需更改标签上的文本即可。您只需重新加载tableview,例如行数改变或您需要重新创建单元格。
使用tableView.indexPathsForVisibleRows获取可见行的索引路径,并迭代可见单元格以更改文本或背景。