为什么 CABasicAnimation 尝试初始化我的自定义 CALayer 的另一个实例?

Tob*_*ias 6 swift

我收到此错误:

致命错误:对类“MyProject.AccordionLayer”使用未实现的初始化程序“init(layer:)”

使用以下代码。在我的视图控制器中:

override func viewDidLoad() {
    let view = self.view as! AccordionView!
    view.launchInitializationAnimations()
}
Run Code Online (Sandbox Code Playgroud)

在我看来:

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    for var i = 0; i < self.accordions.count; ++i {
        var layer = AccordionLayer(accordion: self.accordions[i])
        layer.accordion = self.accordions[i]
        layer.frame = CGRectMake(0, CGFloat(i) * self.getDefaultHeight(), self.frame.width, self.getDefaultHeight())
        self.layer.addSublayer(layer)
        layer.setNeedsDisplay()
        layers.append(layer)
    }
}

func launchInitializationAnimations() {
    for layer in self.layer.sublayers {
        var animation = CABasicAnimation(keyPath: "topX")
        animation.duration = 2.0
        animation.fromValue = CGFloat(0.0)
        animation.toValue = CGFloat(200.0)
        layer.addAnimation(animation, forKey: "animateTopX")
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的子类 CALayer 中

var topX : Int
init(accordion: (color: CGColorRef!, header: String, subtitle: String, image: UIImage?)!) {

    // Some initializations
    // ...

    super.init()
}
Run Code Online (Sandbox Code Playgroud)

我也执行needsDisplayForKey, drawInContext.

我已经看到 2-3 个其他问题具有相同的错误消息,但我无法真正弄清楚它与我自己的具体情况有什么关系。

为什么要CABasicAnimation尝试实例化一个新的(我的自定义)CALayer?

gfp*_*eco 10

我刚刚遇到了同样的问题,在添加init(layer:)到我的自定义后我让它工作了CALayer

override init(layer: Any) {
    super.init(layer: layer)
}
Run Code Online (Sandbox Code Playgroud)

我希望它可以帮助到这里的人。


编辑正如 Ben Morrow 评论的那样,在您的覆盖中,您还必须从自定义类中复制属性值。例如,请参阅他的/sf/answers/2692807491/

  • 在正文中,您还必须手动初始化自定义类中的每个属性。我想出了这个问题:http://stackoverflow.com/questions/38468515/cabasicanimation-creates-empty-default-value-copy-of-calayer/38468678#38468678 (3认同)

mat*_*att 6

为什么 CABasicAnimation 试图实例化一个新的(我的自定义)CALayer?

因为动画涉及制作图层的副本以充当表示层