Для уточнення мети цього питання: Я знаю, ЯК створити складні представлення з обома підвідними та за допомогою drawRect. Я намагаюся повністю зрозуміти, коли і чому варто використовувати один над іншим.
Я також розумію, що не має сенсу оптимізувати це набагато раніше, а зробити щось складніше, перш ніж робити профілювання. Вважайте, що мені комфортно обидва методи, і тепер дуже хочеться глибшого розуміння.
Багато моєї плутанини пов’язане з тим, як дізнатися, як зробити продуктивність прокрутки подання таблиці справді гладкою та швидкою. Звичайно, оригінальне джерело цього методу - від автора за твіттером для iPhone (колишній твіт). В основному йдеться про те, що для того, щоб зробити прокрутку таблиць гладкою, секрет полягає в тому, щоб НЕ використовувати підгляди, а натомість робити весь малюнок в одному спеціальному uiview. По суті, здається, що використання безлічі підзадач сповільнює рендерінг, оскільки у них багато накладних витрат, і вони постійно перекомпоновуються над своїми батьківськими поглядами.
Якщо чесно, це було написано, коли 3GS був досить новим брендом, а iDevices з тих пір стали набагато швидшими. Тим НЕ менше , цей метод буде регулярно пропонується на межсетях і в інших місцях для високих столів продуктивності. Насправді це запропонований метод у таблиці зразків коду Apple , запропонований у кількох відеозаписах WWDC ( Практичний малюнок для розробників iOS ) та багатьох книгах програмування iOS .
Існують навіть дивовижні інструменти для розробки графіки та створення коду Core Graphics для них.
Тому спочатку я вважаю, що "існує основна причина існування Core Graphics. ШВИДКО!"
Але як тільки мені здається, що я отримую ідею "Favor Core Graphics, коли це можливо", я починаю бачити, що drawRect часто відповідає за погану реакцію в додатку, надзвичайно дорогий об'єм пам'яті і дійсно оподатковує процесор. В основному, я повинен " уникати переважаючих малюнківReRect " (WWDC 2012 iOS App iOS: Графіка та анімації )
Тому я здогадуюсь, як і все, це складно. Можливо, ви можете допомогти собі та іншим зрозуміти, коли і чому використовується drawRect?
Я бачу кілька очевидних ситуацій для використання Core Graphics:
- У вас є динамічні дані (приклад акціонерних діаграм Apple)
- У вас є гнучкий елемент інтерфейсу, який неможливо виконати простою зміною зображення
- Ви створюєте динамічну графіку, яка одного разу виведена використовується в декількох місцях
Я бачу ситуації, щоб уникати Core Graphics:
- Властивості вашого перегляду потрібно анімувати окремо
- У вас порівняно невелика ієрархія перегляду, тому будь-яке сприйняття додаткових зусиль із використанням CG не варто вигравати
- Ви хочете оновити фрагменти виду, не перемальовуючи всю справу
- Макет ваших підпоглядів потребує оновлення, коли розмір батьківського перегляду змінюється
Тож даруйте свої знання. У яких ситуаціях ви добираєтесь до drawRect / Core Graphics (що також може бути здійснено за допомогою перегляду)? Які фактори призводять вас до такого рішення? Як / Чому малюнок в одному власному представленні рекомендується використовувати для прокручування осередкових гладких стільниць таблиці, проте Apple радить взагалі нереагувати з причин продуктивності? Що з простими фоновими зображеннями (коли ви створюєте їх за допомогою CG vs за допомогою зміни розміру PNG зображення)?
Глибоке розуміння цього предмета може не знадобитися для того, щоб зробити гідні додатки, але я не люблю обирати методи, не можу пояснити, чому. Мій мозок злість на мене.
Оновлення запитань
Дякую за інформацію всім. Деякі уточнюючі питання тут:
- Якщо ви малюєте щось із базовою графікою, але можете виконати те ж саме за допомогою UIImageViews та попередньо винесеного png, чи слід завжди йти цим маршрутом?
- Аналогічне запитання: Особливо з подібними інструментами для поганих ситуацій , коли слід розглянути можливість малювання елементів інтерфейсу в основній графіці? (Можливо, коли відображення вашого елемента є змінним. Наприклад, кнопка з 20 різними варіантами кольорів. Будь-які інші випадки?)
- З огляду на моє розуміння у моїй відповіді нижче, чи можна досягти того ж підвищення продуктивності для клітинки таблиці, ефективно зафіксувавши растровий знімок вашої клітини після того, як ваш складний UIView відобразиться, і відобразити це під час прокрутки та приховування вашого складного перегляду? Очевидно, деякі фрагменти доведеться опрацювати. Просто цікава думка у мене була.