Получение исключения CALayerInvalidTree в Swift при добавлении ключевой анимации - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь добавить цветную анимацию к кнопке в 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) работает нормально.

...