我想在swift中继承UIView,并且使用CAShapeLayer是此子类的图层类型 - 使用layerClass()覆盖图层类型。
如何访问CAShapeLayer中的属性,但不访问CALayer中的属性 - 例如下面示例中的路径。下面的代码无法编译,因为path不是CALayer的成员。
override class func layerClass() -> AnyClass {
return CAShapeLayer.self
}
override func awakeFromNib() {
var path: UIBezierPath = UIBezierPath.init(ovalInRect: CGRectMake(0, 0, 30, 10))
self.layer.path = path.CGPath
}
答案 0 :(得分:8)
似乎从Swift 3开始,答案就是
override public class var layerClass: Swift.AnyClass {
get {
return CAShapeLayer.self
}
}
答案 1 :(得分:6)
请注意,self.layer始终在UIView中返回一个通用CALayer,因此您必须将其类型化为特定类,以确保它具有正确的类型。您可以执行以下操作以确保将CAShapeLayer的路径调用为CALayer类类型。
override class func layerClass() -> AnyClass {
return CAShapeLayer.self
}
override func awakeFromNib() {
guard let shapeLayer = self.layer as? CAShapeLayer else { return }
let path: UIBezierPath = UIBezierPath.init(ovalInRect: CGRectMake(0, 0, 30, 10))
shapeLayer.path = path.CGPath
}
答案 2 :(得分:2)
投射图层然后使用路径属性
(self.layer as! CAShapeLayer).path = path.CGPath
答案 3 :(得分:2)
从documentation(迅速4)来看,更为简洁:
override class var layerClass: AnyClass {
return CAShapeLayer.self
}