Как использовать CALayer с iPhone?

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

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

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

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

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


person Alex Reynolds    schedule 03.11.2008    source источник


Ответы (3)


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

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

person Louis Gerbarg    schedule 03.11.2008

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

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

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

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

person Louis Gerbarg    schedule 03.11.2008

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

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

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

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

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

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

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

По сути, я хотел бы проверить, поможет ли использование CALayer двух вещей:

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

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

person Alex Reynolds    schedule 03.11.2008