2008-11-03 4 views
4

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

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

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

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

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

ответ

4

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

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

3

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

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

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

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

1

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

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

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

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

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

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

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

В принципе, я хотел бы, чтобы проверить, будет ли или не использовать CALayer выполнить две вещи:

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

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

Смежные вопросы