У меня есть 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:)
, так как это относительно дорого и некоторые другие негативные эффекты, поэтому использование draw(rect:)
? * 1034 - плохая практика *
Есть ли еще одна (чистая) опция, которую я мог бы использовать, чтобы один раз задать путь для своей фигуры?