调用tableView.reloadData()会删除自定义的单元格内动画

时间:2015-11-06 15:27:21

标签: ios swift uitableview

我的应用程序是用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?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果标签上的数据发生变化,则无需重新加载tableview,只需更改标签上的文本即可。您只需重新加载tableview,例如行数改变或您需要重新创建单元格。

使用tableView.indexPathsForVisibleRows获取可见行的索引路径,并迭代可见单元格以更改文本或背景。