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

时间:2015-07-23 21:49:11

标签: 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
}

4 个答案:

答案 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
}