Фрейм представления всегда устанавливается к моменту вызова `draw (_ :)`? - PullRequest
0 голосов
/ 04 апреля 2020

Я использую приведенный ниже код для изгиба края пользовательского представления.

/// Curves `self's` trailing edge.
override func draw(_ rect: CGRect) {
    super.draw(rect)

    let path=UIBezierPath(ovalIn: .init(   // The path defining `self's` curved edge.
        x: rect.width - Self.ovalWidth,   // Align the oval's trailing edge with `self's`.
        y: (rect.height - Self.ovalHeight) / 2,   // Center oval vertically within `self`.
        width: Self.ovalWidth,
        height: Self.ovalHeight
    ))
    path.stroke()   // Draws the border of the curved edge.
    self.layer.mask={ $0.path=path.cgPath; return $0 }(CAShapeLayer())
}

Меня беспокоит то, что, насколько я вижу, нет гарантии, что rect будет равно self.frame; что приведет к неопределенному поведению в том, что касается рисования маски. Возможно ли, что если я использую self.frame вместо rect, то draw(_:) может быть вызван, пока self.frame еще не установлен, или имеет значение, которое не является актуальным? - это представление выложено с помощью AutoLayout.

1 Ответ

0 голосов
/ 04 апреля 2020

Ваши опасения наполовину верны. В соответствии с документами :

Часть границ представления, которая должна быть обновлена. При первом прорисовке вашего вида этот прямоугольник обычно представляет собой все видимые границы вашего вида. Однако во время последующих операций рисования прямоугольник может указывать только часть вашего вида.

Также в документах:

Любой рисунок следует ограничить прямоугольником, указанным в параметр rect

draw (_ :) обычно вызывается только при первом отображении представления (а не при добавлении его в качестве подпредставления) и при вызове setNeedsDisplay () или setNeedsDisplay (_ :) .

Насколько я знаю, есть только две причины для беспокойства. Во-первых, ваш вид отображается до того, как будут установлены все ограничения. Второй - если вы вызываете setNeedsDisplay (_ :) с указанным c прямоугольником.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...