Чтобы прояснить цель этого вопроса: я знаю, КАК создавать сложные представления как с подпредставлениями, так и с использованием drawRect. Я пытаюсь полностью понять, когда и почему использовать один над другим.
Я также понимаю, что не имеет смысла оптимизировать это намного раньше времени и делать что-то более сложное, прежде чем выполнять профилирование. Подумайте, что мне комфортно с обоими методами, и теперь очень хочется более глубокого понимания.
Я часто путаюсь с изучением того, как сделать прокрутку табличного представления действительно плавной и быстрой. Конечно, первоначальный источник этого метода от автора за твиттер для iPhone (ранее tweetie). В основном это говорит о том, что для того, чтобы сделать скроллинг таблицы плавным, секрет состоит в том, чтобы НЕ использовать подпредставления, а вместо этого делать все рисование в одном пользовательском интерфейсе. По сути, кажется, что использование большого количества подпредставлений замедляет рендеринг, потому что у них много накладных расходов, и они постоянно перекомпоновываются в родительские представления.
Честно говоря, это было написано, когда 3GS был довольно новеньким, и с тех пор iDevices стали намного быстрее. Тем не менее , этот метод будет регулярно предлагается на межсетях и в других местах для высоких столов производительности. Фактически, это предложенный метод в Таблице примера кода Apple , предложенный в нескольких видеороликах WWDC ( Практическое рисование для разработчиков iOS ) и во многих книгах по программированию для iOS .
Есть даже потрясающие инструменты для разработки графики и генерации кода Core Graphics для них.
Итак, сначала я считаю, что есть причина, по которой существует Core Graphics. Это БЫСТРО!
Но как только я думаю, что у меня появляется идея: «По возможности выбирайте базовую графику», я начинаю понимать, что drawRect часто отвечает за плохую отзывчивость в приложении, чрезвычайно дорогую память и действительно нагружает процессор. По сути, я должен « избегать переопределения drawRect » ( Производительность iOS-приложения WWDC 2012 : графика и анимация )
Так что, как и все, это сложно. Может быть, вы можете помочь себе и другим понять, когда и зачем использовать drawRect?
Я вижу пару очевидных ситуаций для использования Core Graphics:
- У вас есть динамические данные (пример графика акций Apple)
- У вас есть гибкий элемент пользовательского интерфейса, который не может быть выполнен с простым изменяемым размером изображения
- Вы создаете динамическую графику, которая после визуализации используется в нескольких местах.
Я вижу ситуации, чтобы избежать Core Graphics:
- Свойства вашего вида должны быть анимированы отдельно
- У вас сравнительно небольшая иерархия представлений, поэтому любые дополнительные усилия по использованию компьютерной графики не стоят
- Вы хотите обновить части представления, не перерисовывая все это
- Макет ваших подпредставлений должен обновляться при изменении размера родительского представления.
Так дарите свои знания. В каких ситуациях вы используете DrawRect / Core Graphics (это также может быть достигнуто с помощью подпредставлений)? Какие факторы приводят вас к этому решению? Как / почему рисование в одном пользовательском представлении рекомендуется для плавной прокрутки ячеек таблицы, но Apple рекомендует использовать drawRect для повышения производительности в целом? А как насчет простых фоновых изображений (когда вы создаете их с помощью CG против изображений с изменяемым размером PNG)?
Глубокое понимание этого предмета может и не понадобиться для создания достойных приложений, но я не люблю выбирать методы, не имея возможности объяснить почему. Мой мозг злится на меня.
Обновление вопроса
Спасибо всем за информацию. Некоторые уточняющие вопросы здесь:
- Если вы рисуете что-то с помощью основной графики, но можете добиться того же с помощью UIImageViews и предварительно отрендеренного png, следует ли вам всегда идти по этому пути?
- Подобный вопрос: особенно с такими крутыми инструментами , когда вы должны рассмотреть возможность рисования элементов интерфейса в основной графике? (Возможно, когда отображение вашего элемента является переменным. Например, кнопка с 20 различными цветовыми вариациями. Есть ли другие случаи?)
- Учитывая мое понимание в моем ответе ниже, можно ли получить тот же прирост производительности для ячейки таблицы, эффективно захватив растровое изображение снимка вашей ячейки после самого сложного рендеринга UIView, и отображая его при прокрутке и скрытии сложного представления? Очевидно, что некоторые части должны быть разработаны. Просто интересная мысль у меня была.