Можно ли нарисовать линию за пределами прямоугольника в функции draw (_ rect: CGRect) в подклассе UIView, который поддерживается CATiledLayer?

У меня есть подкласс UIView, поддерживаемый CATiledLayer, где я переопределяю функцию рисования (_ rect: CGRect) для пользовательского рисования. Можно ли нарисовать линию за пределами прямоугольника?


person ckc    schedule 22.08.2018    source источник
comment
Обычно контекст рисования настроен на обрезку рисунка до указанного прямоугольника, и любой рисунок за пределами этого прямоугольника не будет виден. Я не уверен, что произойдет, если clipsToBounds представления будет иметь значение false. Почему бы не сделать простой тест?   -  person Duncan C    schedule 22.08.2018


Ответы (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
comment
Уважаемый Дункан, спасибо за ваш ответ и извините за задержку с ответом. clipsToBounds не будет иметь никакого значения, если установлено значение False. Действительно, вы не можете рисовать за пределами прямоугольника. Мне было интересно, есть ли способ преодолеть эту характеристику, чтобы иметь возможность рисовать за пределами прямоугольника. - person ckc; 23.08.2018
comment
Вероятно, вы могли бы манипулировать областью отсечения графического контекста, но вам не следует этого делать. Дизайн, лежащий в основе drawRect, заключается в том, что система может маскировать все, кроме небольшой части прямоугольника кадра вашего вида, потому что нужно перерисовывать только небольшую часть, а когда вы рисуете, рисунок обрезается. Если вы переопределите этот механизм маскировки, вы можете наступить на части экрана, которые не принадлежат вашему виду, и вызвать плохие побочные эффекты. - person Duncan C; 23.08.2018
comment
Вы только что приняли и проголосовали за мой ответ сегодня, почти 2 года спустя?!? Думаю, лучше поздно, чем никогда ... - person Duncan C; 08.01.2021
comment
Я недавно разместил еще один вопрос и понял, что это правильный ответ, когда я ищу ответ :) - person ckc; 08.01.2021