рисовать вне границ UIView из drawRect - PullRequest
20 голосов
/ 29 ноября 2010

Мой вопрос очень похож на этот Не выводить внешние границы, когда clipToBounds = NO , на который нет четкого ответа.

По сути, у меня есть UIView, и я хочу нарисовать линию от его центра к краю экрана. Вычислить, где находятся эти точки, легко, используя [self convertPoint:(CGPoint){0,0} fromView:[self superview]]; (который находит источник относительно суперпредставления моего представления. Но когда я рисую линию из drawRect моего представления: это обрезается в границах моего представления.

Есть ли способ рисовать за пределами моего представления? Я попытался изменить свойство clipsToBounds, но, похоже, оно не имеет никакого эффекта.

Я не могу нарисовать свои линии из суперпредставления, потому что мне нужно сделать это с несколькими представлениями, и некоторые будут перед другими ... вычисление слоя из drawRect суперпредставления кажется плохой идеей.

Точно так же я не думаю, что могу просто изменить размеры границ моего представления, чтобы включить весь экран, потому что мои представления должны быть динамически изменяемого размера ... границы должны быть ОГРОМНЫМИ (> 20 000 квадратных точек) для это на работу.

1 Ответ

9 голосов
/ 29 ноября 2010

Я бы не рекомендовал рисовать вне границ вида.Либо ваш вид должен изменить размер автоматически, чтобы включить чертеж, либо вам нужны прозрачные перекрывающиеся виды.Или оба.Я не могу вспомнить ситуацию, которую ни один из этих случаев не охватил бы, но мне может не хватить воображения.=)

Вероятно, в настоящее время происходит то, что, когда супер-вид перерисовывается, он сообщает супер-виду, что ему нужно перерисовать, что приводит к стиранию чертежа, который ты делаешь снаружи.Прошло какое-то время, и любой более знающий может (должен!) Исправить меня здесь, если я ошибаюсь.

Я не знаю, если "Quartz Debug" (из стандартной установки инструментов разработчика Apple, /Developer/Applications/Performance Tools/Quartz Debug)) работает в симуляторе, но попробовать стоит.В нем есть режим, который покажет вам, когда и как часто происходит перерисовка, с рамкой и необязательной задержкой для обновлений.

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

Кроме того, если ваши диапазоны настолько динамичны, вы можете рассмотреть рисование в процентахэкрана или суперпредставления, а не точек, может иметь смысл кодировать.

...