Я пытаюсь добавить цветную анимацию к кнопке в Swift.С нулевым значением forKey оно работает нормально - но когда я его называю, оно работает на одном экране, но как только начинается переход на другой экран, я получаю "Terminating app due to uncaught exception 'CALayerInvalidTree', reason: 'expecting model layer not copy: <Project.ButtonGradientLayer: 0x600002cc6be0>'"
Это приложение было создано для нас, и мы сейчасЯ делаю небольшие модификации, поэтому я не до конца понимаю нюансы всего тела кода и ограничен в своем опыте отладки.Я не уверен, с чего начать при обнаружении проблемы.
Поскольку способ написания кода применяется, анимация применяется много раз (> 50) раз, и я хочу предотвратить повышение производительности, назвав ее, когдаон создается и проверяет, существует ли он, перед его повторным применением.
Запуск Xcode 10.0 с Swift 4.2
class SpinButtonView: BaseView {
//lots of other code
private var buttonLayer: ButtonGradientLayer {
// swiftlint:disable force_cast
return layer as! ButtonGradientLayer
}
override class var layerClass: AnyClass {
return ButtonGradientLayer.self
}
}
class ButtonGradientLayer: CAGradientLayer {
//Other code plus definition of colors
var isEnabled: Bool = true {
didSet {
updateColors()
}
}
override init(layer: Any) {
super.init(layer: layer)
prepare()
}
override init() {
super.init()
prepare()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
prepare()
}
private func prepare() {
updateColors()
startPoint = CGPoint(x: 0.5, y: 0)
endPoint = CGPoint(x: 0.5, y: 1)
}
private func updateColors() {
if !isEnabled {
removeAllAnimations()
colors = ButtonGradientLayer.disabledColors
}
else {
colors = ButtonGradientLayer.enabledColors
let animation = CABasicAnimation(keyPath: "colors")
animation.fromValue = ButtonGradientLayer.enabledColors
animation.toValue = ButtonGradientLayer.enabledColors2
animation.duration = 0.85
animation.timingFunction = CAMediaTimingFunction(controlPoints: 0.93, 0.83, 0.1, 1.05)
animation.autoreverses = true
animation.repeatCount = Float.infinity
animation.isRemovedOnCompletion = false
//THIS IS THE LINE THAT IS GIVING ME TROUBLE:
add(animation, forKey: "buttonFlash")
//WHEN I DO THIS INSTEAD IT DOESN'T COMPLAIN:
//add(animation, forKey: nil)
}
}
}
add (animation, forKey: "buttonFlash") вызывает его сбой, новыполнение add (animation, forKey: nil) работает нормально.