首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >调用tableView.reloadData()将删除自定义的单元格动画。

调用tableView.reloadData()将删除自定义的单元格动画。
EN

Stack Overflow用户
提问于 2015-11-06 15:27:20
回答 1查看 1.1K关注 0票数 1

我的应用程序是用SWIFT2.0编写的,需要在iOS 8.1或更高版本上运行。我使用Xcode 7.0。

我正在使用一个标准的UITableViewController。我的UITableView只有一种定制的原型单元格CustomCell,它可以子类为UITableViewCell。CustomCell内部有一对UILabels,它们都有清晰的背景颜色和固定的宽度和高度。所有内容都在Interface中进行了布局。

我经常从另一个来源接收数据(10+时间/s)。我的单元格中的标签必须根据接收到的数据更新它们的内容。我也需要动画标签背景颜色。为此,我使用以下方法:

代码语言:javascript
代码运行次数:0
运行
复制
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)
    }
}

我使用以下代码更新标签:

代码语言:javascript
代码运行次数:0
运行
复制
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 (回调)方法如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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的解决方案?

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-06 20:47:59

如果标签上的数据发生变化,则不需要重新加载表视图,只需更改标签上的文本即可。如果行数发生变化,或者需要重新创建单元格,则只需重新加载表视图。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33570127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档