Значения содержимого массива изображений iPhone CALayer - PullRequest
5 голосов
/ 31 января 2011

Способ загрузки изображения в слой прост:

CALayer *layer = [[CALayer alloc]init];

layer.contents = (id) [UIImage imageNamed:@"image.png"].CGImage;

затем вы добавляете слой в качестве подслоя к виду что-то вроде:

предполагаю, что вы в поле зрения

[self.layer addSublayer:layer];

Теперь я хочу загрузить массив изображений в качестве анимации, чтобы со временем я получал анимированные изображения.

поэтому перед тем, как приступить к анимации, я проверил следующее:

[values insertObject:(id)[UIImage imageNamed:path].CGImage atIndex:i];

конечно, есть цикл, который запускает каждое изображение в правильный индекс ... и затем я получаю массив CGImage .. для анимации.

Я распечатал этот массив и увидел это:

CGImage 0x17d900

CGImage 0x17f4e0

Значения есть ... и я не получаю никаких ошибок ... но я не вижу изображения ...

Дайте мне знать, если у вас есть идея ....

1 Ответ

5 голосов
/ 31 января 2011

Это фрагмент кода, который отлично работал для одного из моих проектов:

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath: @"contents"];
animation.calculationMode = kCAAnimationDiscrete;
animation.duration = 1.0;
animation.values = values; // NSArray of CGImageRefs
[layer addAnimation: animation forKey: @"contents"];

Однако у меня были большие изображения для анимационных кадров и на старых iPhone / iPod, которые вызывали серьезные проблемы с производительностью. Если вы столкнетесь с этим, секретным компонентом будет использование предварительно отрендеренных изображений (IIRC, они представлены с закрытым классом CABackingStore). В двух словах, вы создаете CALayer правильного размера, который использует drawInContext: для рисования одного кадра анимации, затем вы циклически просматриваете кадры анимации, где вы передаете слою изображение кадра, отправляете его display и сохраняете Свойство содержимого в массив. Техника кэширования безопасна, если вы не пытаетесь каким-либо образом манипулировать предварительно отрендеренными изображениями: в основном вы просто делаете layer1.contents = layer2.contents.

Только не тратьте свое время на реализацию вышеперечисленного, если только у вас нет проблем с производительностью.

...