Я не совсем уверен, что понимаю, как должен работать UIBezierPath
.
Я добавил простой UIView
в середине экрана и хотел обрезать его, добавив маску к его слою. Я попробовал это, думая, что получу что-то вроде лозанжи в середине представления:
override func viewDidLoad() {
super.viewDidLoad()
viewToClip.backgroundColor = .white
let bezierPath = UIBezierPath()
bezierPath.move(to: viewToClip.center)
bezierPath.addLine(to: CGPoint(x: viewToClip.center.x - 5, y: viewToClip.center.y))
bezierPath.addLine(to: CGPoint(x: viewToClip.center.x, y: viewToClip.center.y - 5))
bezierPath.addLine(to: CGPoint(x: viewToClip.center.x + 5, y: viewToClip.center.y))
bezierPath.addLine(to: CGPoint(x: viewToClip.center.x, y: viewToClip.center.y + 5))
bezierPath.close()
let testLayer = CAShapeLayer()
testLayer.path = bezierPath.cgPath
viewToClip.layer.mask = testLayer
}
Но вместо этого вид просто исчезает с экрана. Что я делаю не так?
Спасибо за вашу помощь.
addSublayer(testLayer)
наlayer.mask = testLayer
) и получил желаемый результат 19.03.2018drawRect
, так как переопределениеdrawRect
влияет на производительность и должно использоваться только для рисования непосредственно в графическом контексте представления. Кроме того,drawRect
может вызываться несколько раз, что приведет к добавлению ненужных слоев в иерархию слоев представления. Я рад, что этот ответ помог OP, но его следует обновить, чтобы отразить, в чем была проблема и как этот код исправляет проблему. 19.03.2018drawRect
следует использовать только для рисования непосредственно в графическом контексте вида. Это не то, что делает ваш код. Это настройка и добавлениеCALayer
, которые можно и нужно делать в других местах. Вам не нужно переопределять этот метод, если ваше представление задает свое содержимое другими способами. Например, вам не нужно переопределять этот метод, если… ваше представление задает свое содержимое напрямую, используя объект базового слоя developer.apple.com/documentation/uikit/uiview/1622529-drawrect Если вы хотите настроить слои в начале жизненного циклаUIView
, используйтеinit
илиawakeFromNib
20.03.2018init
илиawakeFromNib
, которые гарантированно будут вызываться только один раз в начале жизненного цикла представления.drawRect
может вызываться более одного раза. (Этот метод вызывается при первом отображении представления или при возникновении события, которое делает недействительной видимую часть представления.), что может привести к тому, что ненужные представления/слои добавлена иерархия вида/слоя представления. Так же дело не в том, для чего предназначенdrawRect
, какой код отрисовки. Опять же,drawRect
— это не простоUIView
эквивалентviewDidLoad
, и его не следует рассматривать как таковой. 21.03.2018