У меня есть компонент пользовательского интерфейса (загрузчик) с бесконечной анимацией:
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 удалять мою анимацию? Или есть какая-то документация об этом поведении, я не смог ее найти?