Запустите CAAnimation, когда представление не находится в иерархии представления - PullRequest
0 голосов
/ 18 октября 2019

У меня есть компонент пользовательского интерфейса (загрузчик) с бесконечной анимацией:

class MySpinner: UIView {

...

override var bounds: CGRect {
    didSet {
        updateLayers()
    }
}

override init(frame: CGRect) {
        super.init(frame: frame)
        self.layer.addSublayer(self.animatedLayer)
        self.updateLayers()
        self.startAnimating()
}

private func updateLayers() {
        //Set up path, stroke color and such
        self.animatedLayer.frame = self.bounds
}

private func startAnimating() {
        CATransaction.begin()
        CATransaction.setDisableActions(true) //disable automatic animations by iOS

        let endlessRotationAnimation = CAKeyframeAnimation(keyPath: "transform.rotation")
        endlessRotationAnimation.values = [ 0.0, CGFloat(2.0 * .pi) ]
        endlessRotationAnimation.keyTimes = [ 0.0, 1.0 ]
        endlessRotationAnimation.repeatDuration = .infinity
        endlessRotationAnimation.duration = 1.0
        self.animatedLayer.add(endlessRotationAnimation, forKey: "rotationAnimation")

        CATransaction.commit()
}

}

Оказывается, это не работает. Я предполагаю, что если я вызову startAnimating() до того, как представление будет добавлено в окно, iOS немедленно удалит анимацию. Если я сначала добавлю представление в иерархию представлений, а затем вызову startAnimating(), все начнет работать.

Есть ли способ запретить iOS удалять мою анимацию? Или есть какая-то документация об этом поведении, я не смог ее найти?

...