2

看到很多关于这个主题答案,但无法解决我的特殊情况。

这是一个包含完整动画和日志记录时间线的视频

class AnimationDelegate: UIView {

    deinit {
        print("AnimationDelegate deinitialized")
    }

    override func animationDidStart(anim: CAAnimation) {
        print("animationDidStart")
    }

    override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
        print("animationDidStop")
    }

    func play() {
        let line_1 = CAShapeLayer()
        ...

        let animation = CABasicAnimation()
        animation.delegate = self
        animation.duration = 3000
        animation.repeatCount = 1
        animation.keyPath = "strokeEnd"
        animation.fromValue = 0
        animation.toValue = 360

        layer.addSublayer(line_1)
        line_1.addAnimation(animation, forKey: "StrokeAnimation")

    }
}

let delegate = AnimationDelegate(frame: container.bounds)
container.addSubview(delegate)

delegate.play()

问题被animationDidStart称为,但animationDidStop不是。

这怎么可能?

4

2 回答 2

2

如果animationDidStop您等待更长的时间,将被调用。但这当然不是您所期望的行为。

我猜你想让动画运行 3 秒而不是 3000 秒;完成后,会收到来自委托回调的通知,即animationDidStop.

因此,相反,您需要更改:

animation.duration = 3 

和:

animation.toValue = 1

因此,您会看到两者animationDidStart都会animationDidStop被相应地调用。

于 2015-10-30T21:30:29.263 回答
0

animationDidStart 和 animationDidStop 都不起作用。

我尝试在视图控制器中处理这些行:

let delegate = AnimationDelegate(frame: container.bounds)
container.addSubview(delegate)

delegate.play()

动画有效,但覆盖方法无效。

于 2016-04-30T08:33:17.103 回答