在swift中覆盖UIView中的默认图层类型

Don*_*son 5 ios swift

我想在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
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*uig 8

似乎从Swift 3开始,答案是

override public class var layerClass: Swift.AnyClass {
    get {
        return CAShapeLayer.self
    }
}
Run Code Online (Sandbox Code Playgroud)


San*_*eep 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
    }
Run Code Online (Sandbox Code Playgroud)