Ios 在swift中替代UIView中的默认图层类型

Ios 在swift中替代UIView中的默认图层类型,ios,swift,Ios,Swift,我想在swift中创建UIView子类,并使用CAShapeLayer作为该子类的层类型-使用layerClass()覆盖层类型 如何访问CAShapeLayer中的属性,而不是CALayer中的属性,例如下面示例中的path。下面的代码未编译,因为path不是CALayer的成员 override class func layerClass() -> AnyClass { return CAShapeLayer.self } override func awakeFromNib

我想在swift中创建UIView子类,并使用CAShapeLayer作为该子类的层类型-使用layerClass()覆盖层类型

如何访问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,因此您必须将其类型转换为特定类,以确保其类型正确。您可以执行以下操作,以确保调用path to 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
    }

强制转换图层,然后使用路径特性

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

从Swift 3开始,答案似乎是

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

更简洁的是,来自(Swift 4):


并确保将活动方案设置为在设备(甚至是通用设备)上构建,否则即使在尝试构建之前,也会出现未解决的符号错误。
override class var layerClass: AnyClass {
    return CAShapeLayer.self
}