在Swift中覆盖UIView中的默认图层types

我想在swift中inheritanceUIView,并使用CAShapeLayer是这个子类的图层types – 用layerClass()覆盖图层types。

如何访问CAShapeLayer中的属性,但不访问CALayer中的属性,例如下面的示例中的path。 下面的代码不能编译,因为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 } 

请注意,self.layer总是返回一个UIView内的通用CALayer,所以你必须将它转换为你的特定类,以确保它具有正确的types。 您可以执行以下操作来确保您将path调用到CAShapeLayer而不是CALayer类的types。

  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 } 

看来Swift 3的答案是

 override public class var layerClass: Swift.AnyClass { get { return CAShapeLayer.self } } 

转换图层,然后使用path属性

  (self.layer as! CAShapeLayer).path = path.CGPath