Swift:如何对CALayer进行子类化,使其自动调整大小?

乔什·阿诺德(Josh Arnold)

已知的主/根层UIView,例如view.layer,会自动调整以填充的帧UIView(然而,一个根层的子层将不会自动调整大小)。

CALayer类化后:

class CustomLayer : CALayer {
    //...
}

我可以实现哪些方法来“绘制”内容,以便在用作视图的根CALayer时使图层自动调整大小?


我问这的原因是因为我当前正在调用以下方法:

UIBezierPath(roundedRect: self.view.frame, byRoundingCorners: [.topLeft], cornerRadii: CGSize(width: 17, height: 15))

要更新CALayer的路径,但是能够创建CALayer可以用作的根层的自定义,这真是令人惊讶,UIView因此我不需要始终如一地更新其路径。

有人对此有任何建议吗?最终,我将努力为每个角提供一个可以支持唯一半径的图层,该图层将自动填充UIView并调整大小,而不必始终更新框架。

里奥·达布斯

您可以将UIView子类化,覆盖layerClass并返回CAShapeLayer:

class Shape: UIView {

    override public class var layerClass: AnyClass { CAShapeLayer.self }
    var shapeLayer: CAShapeLayer { layer as! CAShapeLayer }
    
    private var bezierPath: UIBezierPath = UIBezierPath() { didSet { shapeLayer.path = bezierPath.cgPath } }
    
    var fillColor: UIColor = .green { didSet { shapeLayer.fillColor = fillColor.cgColor } }
    var strokeColor: UIColor = .blue { didSet { shapeLayer.strokeColor = strokeColor.cgColor } }
    var lineWidth: CGFloat = 2 { didSet { shapeLayer.lineWidth = lineWidth } }
    
    override func didMoveToSuperview() {
        updateShape()
        shapeLayer.fillColor = fillColor.cgColor
        shapeLayer.strokeColor = strokeColor.cgColor
        shapeLayer.lineWidth = lineWidth
    }
    func updateShape() {
        bezierPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: [.topLeft], cornerRadii: CGSize(width: 17, height: 15))
    }
    override func layoutSubviews() {
        super.layoutSubviews()
        print(#function)
        updateShape()
    }
    override public func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        print(#function)
        // you can change the color of your shape here if needed (dark/light mode)
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Swift中对数组类进行子类化?

来自分类Dev

CALayer无法使用自动版式调整大小

来自分类Dev

解析-使用Swift进行子类化?

来自分类Dev

Swift子类化-如何覆盖Init()

来自分类Dev

如何将CALayer子类化以用作另一个CALayer掩码?

来自分类Dev

使用Swift和Xcode 6对UIGestureRecognizer进行子类化-如何导入UIGestureRecognizerSubclass.h?

来自分类Dev

如何在Swift中对自定义UIViewController进行子类化?

来自分类Dev

如何在Swift中使用泛型对另一个类进行子类化?

来自分类Dev

如何在Swift中对NSOperation进行子类化,以将SKAction对象排队以便串行执行?

来自分类Dev

SKSpriteNode子类化Swift

来自分类Dev

使用输入参数崩溃在Swift中对CIFilter进行子类化

来自分类Dev

在Swift中进行子类化时了解init()

来自分类Dev

如何调整LiveCode堆栈的大小,使其自动适合任何目标设备的屏幕?

来自分类Dev

如何自动调整网格中内容的大小,使其适合所有分辨率

来自分类Dev

如何调整LiveCode堆栈的大小,使其自动适合任何目标设备的屏幕?

来自分类Dev

自动布局:如何调整标签大小,以使其在基线时不被截断

来自分类Dev

如何子类化SKNode以将其初始化为预定大小

来自分类Dev

子类化RelativeLayout | 如何/在课堂上从哪里得到它的大小?

来自分类Dev

如何子类化NSTextAttachment?

来自分类Dev

如何子类化UIViewControllers?

来自分类Dev

如何子类化SKScene

来自分类Dev

如何子类化UIView?

来自分类Dev

如何首先使用EF数据库进行子类化

来自分类Dev

如何使用非可选属性对UITableViewController进行子类化

来自分类Dev

如何避免使用合成对Pandas DataFrame进行子类化?

来自分类Dev

如何首先使用EF数据库进行子类化

来自分类Dev

对装饰类进行子类化

来自分类Dev

如何在Swift中为结构子类化?

来自分类Dev

在Swift中子类化CIFilter

Related 相关文章

  1. 1

    如何在Swift中对数组类进行子类化?

  2. 2

    CALayer无法使用自动版式调整大小

  3. 3

    解析-使用Swift进行子类化?

  4. 4

    Swift子类化-如何覆盖Init()

  5. 5

    如何将CALayer子类化以用作另一个CALayer掩码?

  6. 6

    使用Swift和Xcode 6对UIGestureRecognizer进行子类化-如何导入UIGestureRecognizerSubclass.h?

  7. 7

    如何在Swift中对自定义UIViewController进行子类化?

  8. 8

    如何在Swift中使用泛型对另一个类进行子类化?

  9. 9

    如何在Swift中对NSOperation进行子类化,以将SKAction对象排队以便串行执行?

  10. 10

    SKSpriteNode子类化Swift

  11. 11

    使用输入参数崩溃在Swift中对CIFilter进行子类化

  12. 12

    在Swift中进行子类化时了解init()

  13. 13

    如何调整LiveCode堆栈的大小,使其自动适合任何目标设备的屏幕?

  14. 14

    如何自动调整网格中内容的大小,使其适合所有分辨率

  15. 15

    如何调整LiveCode堆栈的大小,使其自动适合任何目标设备的屏幕?

  16. 16

    自动布局:如何调整标签大小,以使其在基线时不被截断

  17. 17

    如何子类化SKNode以将其初始化为预定大小

  18. 18

    子类化RelativeLayout | 如何/在课堂上从哪里得到它的大小?

  19. 19

    如何子类化NSTextAttachment?

  20. 20

    如何子类化UIViewControllers?

  21. 21

    如何子类化SKScene

  22. 22

    如何子类化UIView?

  23. 23

    如何首先使用EF数据库进行子类化

  24. 24

    如何使用非可选属性对UITableViewController进行子类化

  25. 25

    如何避免使用合成对Pandas DataFrame进行子类化?

  26. 26

    如何首先使用EF数据库进行子类化

  27. 27

    对装饰类进行子类化

  28. 28

    如何在Swift中为结构子类化?

  29. 29

    在Swift中子类化CIFilter

热门标签

归档