我知道这个错误:
致命错误:类'MyProject.AccordionLayer‘使用未实现的初始化器’init(层:)‘
使用以下代码。在我看来,控制器:
override func viewDidLoad() {
let view = self.view as! AccordionView!
view.launchInitializationAnimations()
}我认为:
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")
}
}在我的子类CALayer中
var topX : Int
init(accordion: (color: CGColorRef!, header: String, subtitle: String, image: UIImage?)!) {
// Some initializations
// ...
super.init()
}我还实现了needsDisplayForKey,drawInContext。
我已经看到了2-3个带有相同错误信息的问题,但我无法真正弄清楚这与我自己的具体情况有什么关系。
为什么CABasicAnimation试图实例化一个新的(我的自定义) CALayer?
发布于 2016-03-15 17:05:45
我刚刚遇到了同样的问题,在将init(layer:)添加到我的自定义CALayer之后,它就开始工作了。
override init(layer: Any) {
super.init(layer: layer)
}我希望它能帮助到这里的人。
编辑作为Ben注释,在重写中还必须从自定义类中复制属性值。例如,请参见他的https://stackoverflow.com/a/38468678/341994。
发布于 2019-01-15 20:57:52
为什么CABasicAnimation试图实例化一个新的(我的自定义) CALayer?
因为动画需要制作一个图层的副本作为表示层。
https://stackoverflow.com/questions/31892986
复制相似问题