获取UIView的边界并设置边界一次

时间:2018-08-24 22:16:08

标签: swift uiview draw uibezierpath cashapelayer

我有一个UIView和一个CAShapeLayerCAShapeLayer的路径在layoutSubviews中设置:

class CustomView: UIView {

    let shape = CAShapeLayer()

    override init(frame: CGRect) {
        super.init(frame: frame)

        // setup shape
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        shape.path = UIBezierPath(rect: bounds).cgPath // I've simplified this
    }
}

这将按预期方式工作并相应显示形状。但是,如果我想为该CAShapeLayer的路径设置动画,那么无论何时调用layoutSubviews都会遇到问题。


可能的解决方法:1

var initialSetup = true

override func layoutSubviews() {
    super.layoutSubviews()

    if initialSetup { shape.path = UIBezierPath(rect: bounds).cgPath }
}

可能的解决方法:2

lazy var shape: CAShapeLayer = {
    let shape = CAShapeLayer()

    // setup shape

    shape.path = UIBezierPath(rect: bounds).cgPath

    return shape
}()

override func layoutSubviews() {
    super.layoutSubviews()

    shape.alpha = 1 // random call
}

可能的修复:3

override func draw(_ rect: CGRect) {
    super.draw(rect)

    oval.path = UIBezierPath(rect: bounds).cgPath
}

固定数字3似乎是最干净的数字,但我记得(模糊地)在某处阅读以避免尽可能使用draw(rect:),因为它相对昂贵且有其他一些负面影响,因此使用{{1} }?

是否可以使用另一个(干净的)选项设置形状的路径一次?

0 个答案:

没有答案