Получение границ UIView и один раз установить границы - PullRequest
0 голосов
/ 25 августа 2018

У меня есть 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 - плохая практика *

Есть ли еще одна (чистая) опция, которую я мог бы использовать, чтобы один раз задать путь для своей фигуры?

...