Чтобы прояснить цель этого вопроса: Я знаю, КАК создавать сложные представления как с субвью, так и с использованием drawRect. Я пытаюсь полностью понять, когда и почему использовать один над другим.
Я также понимаю, что не имеет смысла оптимизировать это намного раньше времени и делать что-то более трудное, прежде чем делать какие-либо профилирования. Подумайте, что мне комфортно с обоими методами, и теперь действительно хочу получить более глубокое понимание.
Большая часть моей путаницы связана с обучением тому, как сделать производительность прокрутки таблицы очень гладкой и быстрой. Конечно, исходный источник этого метода принадлежит автору за твиттером для iPhone (ранее tweetie). В основном это говорит о том, что для того, чтобы заставить таблицу прокручивать маслянистую гладко, секрет заключается в том, чтобы НЕ использовать subviews, но вместо этого делать все чертежи в одном пользовательском uiview. По сути, кажется, что использование большого количества подзадач замедляет рендеринг, потому что они имеют много накладных расходов и постоянно перекомпонованы по их родительским представлениям.
Чтобы быть справедливым, это было написано, когда 3GS был довольно популярным бренном spankin, и iDevices стали намного быстрее с тех пор. Тем не менее этот метод interwebs и в других местах для таблиц высокой производительности. На самом деле это предлагаемый метод в Примерном примере Apple Table, был предложен в нескольких видеороликах WWDC (Практический чертеж для разработчиков iOS) и многие книги iOS .
Есть даже удивительные поисковые инструменты для разработки графики и создания для них кода Core Graphics.
Итак, сначала я убежден, что "причина, по которой Core Graphics существует, ее FAST!"
Но как только я думаю, что получаю идею "Лучшая графическая графика, когда это возможно", я начинаю видеть, что drawRect часто несет ответственность за плохой отзывчивость в приложении, чрезвычайно дорогая память, и действительно взимает плату с CPU. В принципе, я должен "избегать переопределения drawRect" (WWDC 2012 Производительность приложений iOS: графика и анимация)
Итак, я думаю, как и все, это сложно. Может быть, вы можете помочь себе и другим понять, когда и почему использовать drawRect?
Я вижу пару очевидных ситуаций для использования Core Graphics:
- У вас есть динамические данные (пример диаграммы Apple Stock).
- У вас есть гибкий элемент пользовательского интерфейса, который не может быть выполнен с помощью простого изменяемого размера изображения.
- Вы создаете динамическую графику, которая после отображения используется в нескольких местах
Я вижу ситуации, чтобы избежать Core Graphics:
- Свойства вашего представления необходимо анимировать отдельно
- У вас относительно небольшая иерархия представлений, поэтому любые предполагаемые дополнительные усилия с использованием CG не стоят выигрыша.
- Вы хотите обновить фрагменты представления, не перерисовывая все это.
- Макет ваших подсмотров должен обновляться при изменении размера родительского представления.
Так дайте свои знания. В каких ситуациях вы достигаете графика drawRect/Core (что также может быть выполнено с помощью subviews)? Какие факторы приводят вас к такому решению? Как/Почему чертеж в одном пользовательском представлении рекомендуется для масляной гладкой прокрутки ячейки таблицы, но Apple советует drawRect против по соображениям производительности в целом? Как насчет простых фоновых изображений (когда вы создаете их с помощью CG и с помощью изменяемого размера изображения png)?
Глубокое понимание этого предмета может не понадобиться, чтобы делать полезные приложения, но я не люблю выбирать между приемами, не объясняя почему. Мой мозг злится на меня.
Обновление вопроса
Спасибо за информацию всем. Некоторые разъясняющие вопросы здесь:
- Если вы рисуете что-то с основной графикой, но можете сделать то же самое с UIImageViews и предварительно рендеризованным png, должен ли вы всегда идти по этому маршруту?
- Аналогичный вопрос: особенно с такими инструментами, как этот, когда вы должны рассмотреть возможность рисования элементов интерфейса в основной графике? (Возможно, когда дисплей вашего элемента является переменным, например, кнопка с 20 различными цветовыми вариациями. Другие случаи?)
- Учитывая мое понимание в моем ответе ниже, может ли тот же прирост производительности для ячейки таблицы быть получен, эффективно захватив растровое изображение моментальной копии вашей ячейки после того, как ваш комплексный UIView сделает сам, и показывая, что при прокрутке и скрытии вашего сложного представления? Очевидно, некоторые части должны быть разработаны. Просто интересная мысль, которую я имел.