2014-10-27 5 views
7

Следует ли вызывать чертеж CAShapeLayers от drawRect() или layoutSubviews()?Пользовательский рисунок UIView с layoutSubviews vs drawRect

Согласно документации Apple по UIView, операции рисования должны быть помещены в drawRect().

Однако это не относится к сессии WWDC Кевина Катей: What's New in Interface Builder (где он демонстрирует процесс создания пользовательского UIView, доступного в Interface Builder).

Во время демонстрации он выполняет чертеж вида в layoutSubviews, а не drawRect.

Его объяснение было то, что:

Если бы я реализовать DrawRect, что не собирается получить нам лучшую производительность; в то время как использование подслоев и подзаголовков принесет нам действительно хорошую производительность.

Из того, что я до сих пор читал в StackOverflow, кажется, что переопределение метода drawRect() может привести к снижению производительности. Частично это связано с setNeedsDisplay, что приводит к дорогостоящим ручным перерисовкам.

Но просматривая документы Apple и приложения реального мира. Имеет смысл, что drawRect() должен нести ответственность за нанесение изображения и layoutSubviews().

ответ

1

Я бы сказал, это зависит. Если размер вашей фигуры будет зависеть от системы автоматического макета, то может быть полезно сделать рисунок в Layout Subview против Draw Rect.

Во-первых, почему в планировках лучше всего работать? Хорошо, что у меня есть UIView (мой родительский взгляд), который рисует Circle View (мое подчинение), в котором используется слой с фигурой. Размер этого круга определяется ограничениями ширины и высоты в моем родительском представлении. Мне только нужно перерисовать круг, когда ограничения ширины/высоты изменены в Parent View. Это пример, когда полезно иметь код рисования в Subviews Layout, потому что мне нужно только перерисовать слой формы при изменении ограничений. Давайте посмотрим циклу Автокомпоновку

  1. Обновления Ограничения
  2. Layout подвиды
  3. Отрендерьте Просмотры

К подобозрению компоновочного времени называются мы знаем, размер кадра мы работаем и могут безопасно выполнять наш рисунок. Я знаю, что в документации говорится, что вы должны использовать этот метод, чтобы просто установить фрейм, границы и т. Д. Однако рисование внутри кадра не кажется необоснованным в зависимости от обстоятельств.

Если вид круга не зависит от системы автоматического макета и может быть изменен в любое время независимо от компоновки пользовательского интерфейса, то, вероятно, было бы более полезно, чтобы рисунок рисовал прямоугольник, чтобы он мог постоянно обновлено. Я думаю, что это меньше идеальной ситуации, так как больше пользовательских интерфейсов в iOS соответствует использованию Auto Layout, поэтому рекомендуется использовать Layout Subviews.

Смежные вопросы