Как перебрать массив подслоя основной анимации и применить анимацию последовательно - PullRequest
0 голосов
/ 01 сентября 2010

Я хочу анимировать через массив CATextLayers, один за другим. Слои создаются и добавляются в цикле. Мне нужно чтобы анимация работала как флипбук. До сих пор, в качестве подтверждения концепции, я использовал CABasicAnimations, но для того, чтобы анимировать несколько слоев последовательно, я думаю, что мне нужен один из других опций Core Animation, но я не уверен, какой именно. Вот цикл добавления подслоев:

- (void) initLayers: (NSString *)endChar
{
CALayer *rootLayer = self.layer;
int counter =0;

for (NSString *element in alphabet) {
    NSLog(@"element: %@",element);
    NSString *topLayerName = [NSString stringWithFormat:@"TOP_%d_%@",counter,element];
    NSString *bottomLayerName = [NSString stringWithFormat:@"BOT_%d_%@",counter,element];
    //get index of endchar - indexOfObject

    if (element != endChar) { //change to if key value is less than or equal to endchar index value

        CATextLayer *topLayer = [CATextLayer layer];
        topLayer.name = topLayerName;
        [topLayer setAnchorPoint:CGPointMake(0.5f,1.0f)]; // set the anchorpoint for the transform. This affects layer position too
        topLayer.bounds = CGRectMake(0.0f, 0.0f, CHARACTER_WIDTH, CHARACTER_HEIGHT/2);
        topLayer.string = element;
        topLayer.font = solariFont.fontName;
        topLayer.fontSize = FONT_SIZE;
        topLayer.backgroundColor = [UIColor blackColor].CGColor;
        topLayer.position = CGPointMake(30,30);
        topLayer.wrapped = NO;
        [rootLayer addSublayer:topLayer];


        CATextLayer *bottomLayer = [CATextLayer layer];

        bottomLayer.name =bottomLayerName;
        [bottomLayer setAnchorPoint:CGPointMake(0.5f,0.0f)]; // set the anchorpoint for the transform. This affects layer position too

        bottomLayer.bounds = CGRectMake(0.0f,CHARACTER_HEIGHT/4, CHARACTER_WIDTH, CHARACTER_HEIGHT/2);
        bottomLayer.string = element;
        bottomLayer.font = solariFont.fontName;
        bottomLayer.fontSize = FONT_SIZE;
        bottomLayer.backgroundColor = [UIColor blackColor].CGColor;
        bottomLayer.position = CGPointMake(topLayer.position.x,topLayer.position.y+2);
        bottomLayer.wrapped = NO;

        [rootLayer addSublayer:bottomLayer];

        counter++;
    }

}


[self animChars:rootLayer.sublayers];
}

Вопрос в том, как я могу анимировать слои один за другим без анимации для каждого слоя, происходящего одновременно? Я хочу иметь возможность проходить через массив подслоев и анимировать каждый CATextLayer по порядку. Нужны ли мне CATransaction, MediaTiming? Я прошел через руководство по основной анимации, но не мудрее.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2010

Я сделал это, дав каждой анимации ключ и проверив это в animationDidStop:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {

    if (anim ==[topFront animationForKey:@"topCharFlip"]) { ....
0 голосов
/ 08 сентября 2010

Это очень легко на самом деле.Сначала вам нужно определить интервал между анимациями, которые вы хотите.Когда вы добавляете слой к корневому слою внутри цикла for, задайте для свойства мультимедийного хронирования beginTime значение CGFloat, которое увеличивается при каждом запуске цикла.

для анимации используйте CABasicAnimation ... если выне знаю, как настроить один из них, в Интернете много ресурсов.

...