Как я могу использовать CALayer с iPhone? - PullRequest
4 голосов
/ 03 ноября 2008

В настоящее время у меня есть подкласс UIView, который «штампует» один 2xx2px CGLayerRef по экрану, до 160 x 240 раз.

В настоящее время я анимирую это, перемещая UIView «вверх» экрана на 2 пикселя (фактически, UIImageView) и затем рисуя следующую «строку».

Ускоряет ли использование нескольких слоев CALayer производительность рендеринга этой анимации?

Существуют ли учебные пособия, примеры приложений или фрагменты кода для использования CALayer с iPhone SDK?

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

Ответы [ 3 ]

4 голосов
/ 03 ноября 2008

Хорошо, хорошо, если вы хотите что-то, что имеет несколько хороших примеров хорошего CA, который рисует такие вещи и работает на телефоне, я рекомендую код GeekGameBoard , который опубликовал Йенс Афлке (это улучшенный версия некоторого демонстрационного кода Apple).

Исходя из того, что вы описываете, я думаю, что вы делаете что-то более сложное, чем нужно. У меня сложилось впечатление, что вам нужен в основном статичный вид, который вы анимируете, смещая его положение так, чтобы оно было частично вне экрана. Если вам просто нужно установить некоторое статическое содержимое в вашем drawRect, прохождение слоев не будет быстрее, чем просто вызов CGFillRect () с вашим цветом. После этого вы можете просто использовать неявную анимацию и прокси-сервер аниматора в UIView для перемещения представления. Я подозреваю, что вы могли бы даже избавиться от пользовательской реализации drawRect: с помощью шаблонного UIColor, но я, честно говоря, не сравнивал разницу между ними.

3 голосов
/ 03 ноября 2008

Какие методы CALayer, которые вы видите, не работают на iPhone? Помимо функций анимации, связанных с CoreImage, я не заметил много чего не хватает. Самое важное, что вы, вероятно, заметите, это то, что все виды имеют слоистую подложку (поэтому вам не нужно делать ничего особенного, чтобы использовать слои, вы можете просто получить слой UIView через методы доступа к слоям), а система координат имеет верх левый источник.

В любом случае, как правило, иметь больше вещей медленнее, чем иметь меньше вещей. Если вы просто повторяете один и тот же шаблон снова и снова, вы, вероятно, обнаружите, что лучшая производительность - это реализация пользовательского UIView / CALayer / UIColor, который знает, как рисовать то, что вы хотите, а не размещать визуально идентичные слои или представления рядом друг с другом .

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

Возможно, вы захотите посмотреть - [UIColor initWithPatternImage:] в зависимости от того, что именно вы пытаетесь сделать. Если вы используете этот двухпиксельный шаблон в качестве цвета фона, вы можете просто сделать UIColor, который его рисует, и установить фон.

1 голос
/ 03 ноября 2008

Какие методы CALayer, которые вы видите, не работают на iPhone?

В качестве одного из примеров я попытался реализовать демонстрацию сетки здесь , но без особой удачи. Похоже, CAConstraintLayoutManager и CAConstraint недоступны в QuartzCore.h.

В другой попытке я попытался использовать очень простой маленький объект размером 20x20 CALayer в качестве подслоя свойства моего слоя UIView, но он не появился.

Прямо сейчас у меня есть пользовательский UIView, из которого я переопределяю метод drawRect. В drawRect я беру контекст и отображаю два типа CGLayerRef s:

В «выключенных» ячейках я рисую цвет фона по всему холсту 320x480.

В ячейках «вкл» я рисую один CGLayerRef в сетке 320x480 пикселей (инициализация) или в строке 320x2 (анимация).

Во время анимации я делаю UIImageView просмотр клипа из 320x478 пикселей и рисую одну строку. Это «выталкивает» мое растровое изображение на экран по два пикселя за раз.

По сути, я хотел бы проверить, будет ли использование 1030 * выполнять две вещи:

  1. Сделайте мой рендеринг быстрее, если CALayer имеет меньше накладных расходов, чем то, что я делаю сейчас
  2. Сделайте мою анимацию более плавной, позволяя мне плавно перемещать слой вверх по экрану

К сожалению, я не могу заставить работать базовый CALayer в данный момент, и я не нашел хороший кусок примера кода, на который можно было бы посмотреть и поиграть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...