我有一个UIView
和一个CAShapeLayer
。 CAShapeLayer
的路径在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} }?
是否可以使用另一个(干净的)选项设置形状的路径一次?