滚动Tableview时,UITableViewCells内容动画变得混乱

时间:2018-07-12 11:06:44

标签: ios swift uitableview animation

我正在玩动画。我设置了一个tableView,其中包含一个自定义tableViewCell,其中包含一个UIViewUIView的宽度在10秒内从400变为0。现在具有tableView的键性质,在滚动表时将呈现单元格。这可以做某些事情:

  1. 离开可见帧时正在设置动画的单元格; UIView消失了。
  2. 滚动时,一些UIView会在显示单元格时开始动画显示。

这是代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellid, for: indexPath) as! listTableViewCell
    cell.testlabel.text = "\(indexPath.row)"
    return cell
}

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if let myCell = cell as? listTableViewCell {
        UIView.animate(withDuration: 10, animations: {
            myCell.timeRemainingView.frame.size.width = 0
            self.loadViewIfNeeded()
        })
    }

}

问题:我希望所有单元在应用启动时开始动画,并在滚动时保持动画。

enter image description here

更新:

这就是我所做的。我正在使用CADisplayLink并以这种方式运行动画。我正在自定义tableviewcell文件中执行所有这些操作。我唯一需要弄清楚的是每个单元的自定义持续时间。这是代码:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    contentView.addSubview(timeRemainingView)
    contentView.addSubview(testlabel)
    contentView.bringSubviewToFront(testlabel)
    contentView.backgroundColor = .white

    let displayLink = CADisplayLink(target: self, selector: #selector(handleProgressAnimation))
    displayLink.add(to: .main, forMode: .defaultRunLoopMode)
    setupViews()



}
let animationDuration = 60.0
let animationStartDate = Date()


@objc func handleProgressAnimation() {
    let currenttime = Date()
    let elapsed = currenttime.timeIntervalSince(animationStartDate)


    let percentage = elapsed / animationDuration
    timeRemainingView.frame.size.width = CGFloat(400 - (400 * percentage))

}

有什么提示或建议吗?

1 个答案:

答案 0 :(得分:-2)

像这样替换您的cellForRowAtIndex:

    let identifier = "homeCell"
    var cell = tableView.dequeueReusableCell(withIdentifier: identifier) as! listTableViewCell
    if cell == nil {
        tableView.register(UINib(nibName: "listTableViewCell", bundle: nil), forCellReuseIdentifier: identifier)
        cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? listTableViewCell
    }
    cell.testlabel.text = "\(indexPath.row)"
return cell