У меня есть подкласс UIView, поддерживаемый CATiledLayer, где я переопределяю функцию рисования (_ rect: CGRect) для пользовательского рисования. Можно ли нарисовать линию за пределами прямоугольника?
Можно ли нарисовать линию за пределами прямоугольника в функции draw (_ rect: CGRect) в подклассе UIView, который поддерживается CATiledLayer?
Ответы (1)
Я только что провел тест, и нет, похоже, вы не можете рисовать за пределами прямоугольника, предоставленного при вызове функции draw(_:)
.
Я создал собственный подкласс UIView, который переопределяет draw(_:)
:
class CustomView: UIView {
override func draw(_ rect: CGRect) {
let drawRect = rect.insetBy(dx: -10, dy: -10)
let path = UIBezierPath(rect: drawRect)
UIColor.yellow.setFill()
path.fill()
}
}
А затем я добавил CustomView в свою раскадровку. Я установил представление в раскадровке с помощью layer.borderWidth = 2
, чтобы вы могли видеть границу представления, и вот что было нарисовано:
Мой метод draw(_:)
попытался вставить прямоугольник рисования на (-10, -10), в результате чего прямоугольник стал больше, но рисунок не отображается за пределами границ, установленных в раскадровке.
person
Duncan C
schedule
22.08.2018
Уважаемый Дункан, спасибо за ваш ответ и извините за задержку с ответом.
clipsToBounds
не будет иметь никакого значения, если установлено значение False
. Действительно, вы не можете рисовать за пределами прямоугольника. Мне было интересно, есть ли способ преодолеть эту характеристику, чтобы иметь возможность рисовать за пределами прямоугольника.
- person ckc; 23.08.2018
Вероятно, вы могли бы манипулировать областью отсечения графического контекста, но вам не следует этого делать. Дизайн, лежащий в основе drawRect, заключается в том, что система может маскировать все, кроме небольшой части прямоугольника кадра вашего вида, потому что нужно перерисовывать только небольшую часть, а когда вы рисуете, рисунок обрезается. Если вы переопределите этот механизм маскировки, вы можете наступить на части экрана, которые не принадлежат вашему виду, и вызвать плохие побочные эффекты.
- person Duncan C; 23.08.2018
Вы только что приняли и проголосовали за мой ответ сегодня, почти 2 года спустя?!? Думаю, лучше поздно, чем никогда ...
- person Duncan C; 08.01.2021
Я недавно разместил еще один вопрос и понял, что это правильный ответ, когда я ищу ответ :)
- person ckc; 08.01.2021
clipsToBounds
представления будет иметь значение false. Почему бы не сделать простой тест? - person Duncan C   schedule 22.08.2018