我自己写了一个CAShapeLayer的子类,然后用的时候就出问题了
class LoadingSharpLayer: CAShapeLayer {
override init() {
super.init()
let center:CGPoint = CGPointMake(25, 25)
let uPath:UIBezierPath = UIBezierPath(arcCenter: center, radius: 15 , startAngle: 0 , endAngle: 5.5 , clockwise: true)
self.path = uPath.CGPath
self.fillColor = UIColor.clearColor().CGColor
self.strokeColor = UIColor.blueColor().CGColor
self.lineWidth = 5
self.strokeStart = 0
self.strokeEnd = 0
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func updateLoadingView(process:CGFloat){
self.strokeEnd = process < 1 ? process : 1
}
}
loadingLayer.position = CGPointMake(width/2, height/2)
// fatal error: use of unimplemented initializer 'init(layer:)' for class 'tableView.LoadingSharpLayer
一看控制台就明白了,找不到init(layer:)这个初始方法。所以把这个方法重载进去就行了
override init(layer: AnyObject) {
super.init(layer: layer)
}
对于这种问题是在是伤脑筋,因为个人觉得SWift的构造器规则确实比较繁琐,但是梳理一下清楚了许多。对于构造器的继承这一块,手册上给了两个规则
1,如果子类没有任何指定构造器,则自动继承父类所有指定构造器(言外之意就是如果子类有一个指定构造器(不管是重载还是自己声明的),那么父类的其他指定构造器子类均不会自动继承)
2 如果子类提供了父类所有指定构造器的实现,不管是通过1还是手动重载的,子类都将会自动继承所有父类的便利构造器,(言外之意就是如果子类中没有任何初始化方法,那么子类将继承父类所有的构造器(指定和便利))
tip 如果子类中只有自定义的便利构造器,那么也会满足规则1。
所以,本人中的问题就在于当重载了指定构造器init()之后,init(layer: AnyObject)不会自动继承,所以出错。
然而,当我取消掉CASharpLayer的隐式动画之后,不加上init(layer: AnyObject)程序也能正常进行,由此可见,当使用了隐式动画的时候,init(layer: AnyObject)这个指定构造方法会被调用,反之,则不会。
CATransaction.begin();
CATransaction.setDisableActions(true)
loadingLayer.position = CGPointMake(width/2, height/2)
loadingLayer.updateLoadingView(self.currentHeight/QTableViewRefreshConfig.TriggerOffsetToPull)
CATransaction.commit();
最后,手册上的一则口诀:指定构造器向上代理 ,便利构造器横向代理 。