UITableView scrollToRow在UITableViewCell中中断UIView.animate()

时间:2018-12-29 00:11:41

标签: ios swift uitableview animation

我想创建一个类似于聊天的视图,并且为了模拟正在编写的消息,我添加了一个点气泡单元,该点的Alpha值从0到1动画。

我已将此动画添加到自定义单元格的layoutSubviews()方法中。

enter image description here

但是,我还要调用tableView.scrollToRow(),因此表视图始终向用户显示最后一个单元格。但是我意识到,调用此方法会破坏单元格内部的动画(无论我是动画的还是scrollToRow()方法)。

我该怎么办?感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

只需在您的键入指示器单元格中创建两个实例方法 一个用于开始动画,另一个用于resetAnimation

2>/dev/null

2>&1上重置动画

class TypingCell: UITableViewCell {
    fileprivate let MIN_ALPHA:CGFloat = 0.35

    @IBOutlet weak var dot0: UIView!
    @IBOutlet weak var dot1: UIView!
    @IBOutlet weak var dot2: UIView!

    private func startAnimation() {
        UIView.animateKeyframes(withDuration: 1.5, delay: 0, options: [.repeat, .calculationModeLinear], animations: {
            UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.1666, animations: {
            self.dot0.alpha = MIN_ALPHA
            })
            UIView.addKeyframe(withRelativeStartTime: 0.16, relativeDuration: 0.1666, animations: {
            self.dot0.alpha = 1
            })
            UIView.addKeyframe(withRelativeStartTime: 0.33, relativeDuration: 0.1666, animations: {
            self.dot1.alpha = MIN_ALPHA
            })
            UIView.addKeyframe(withRelativeStartTime: 0.49, relativeDuration: 0.1666, animations: {
            self.dot1.alpha = 1
            })
            UIView.addKeyframe(withRelativeStartTime: 0.66, relativeDuration: 0.1666, animations: {
            self.dot2.alpha = MIN_ALPHA
            })
            UIView.addKeyframe(withRelativeStartTime: 0.83, relativeDuration: 0.1666, animations: {
            self.dot2.alpha = 1
            })
        }, completion: nil)
    }

    func resetAnimation() {
        dot0.layer.removeAllAnimations()
        dot1.layer.removeAllAnimations()
        dot2.layer.removeAllAnimations()

        DispatchQueue.main.async { self.startAnimation() }
    }

}