Как анимировать объекты CATransform3D с помощью CAKeyframeAnimation?

Я использовал CAKeyframeAnimations для анимации свойств слоя transform.rotation и transform.translation.x , но у меня проблемы с анимацией свойство преобразовать неявно. У меня есть слой, который должен анимироваться между двумя состояниями, а интерполяция по умолчанию CABasicAnimation полностью неверна и не следует по пути, который я хочу. CAKeyframeAnimation спешит на помощь, по крайней мере, я так подумал. Любая попытка анимировать преобразование с использованием CAKeyframeAnimation приводит к немедленной привязке вида к окончательному преобразованию, в то время как другие анимации выполняются. Если я удалю первую половину следующей функции и позволю моим событиям «преобразования» использовать CABasicAnimation внизу, она будет анимироваться отлично, хотя и с некорректно интерполированными преобразованиями.

Мой делегат уровня реализовал следующее:

- (id <CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)event
{    
    if ([event isEqualToString:@"transform"])
    {
        CGSize startSize = ((CALayer *)self.layer.presentationLayer).bounds.size;
        CGSize endSize = self.layer.bounds.size;

        CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:event];
        animation.duration = 0.25;

        NSMutableArray *values = [NSMutableArray array];

        int stepCount = 10;
        for (int i = 0; i < stepCount; i++)
        {
            CGFloat p = i / (float)(stepCount - 1);
            CGSize size = [self interpolateBetweenSize:startSize andSize:endSize percentage:p];
            CATransform3D transform = [self transformForSize:size];
            [values addObject:[NSValue valueWithCATransform3D:transform]];
        }

        animation.values = values;
        return animation;
    }

    // All other animations use this basic animation
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    animation.removedOnCompletion = YES;
    animation.fillMode = kCAFillModeForwards;
    animation.duration = 0.25;
    return animation;
}

Мое преобразование - это перевод, за которым следует поворот, но я думаю, что групповая анимация с отдельными анимациями по ключевым кадрам, анимируемыми посредством перевода и поворота, приведет к безумному городу. Я подтвердил, что размер и преобразование верны для всех значений p, которые я передаю, а p строго колеблется от 0 до 1.

Я пробовал установить нестандартную временную функцию, я пробовал установить массив временных функций, я пропустил keyTImes, я установил repeatCount равным 0, removeOnCompletion = YES и fillMode равным нападающие, и это не имело никакого эффекта. Я неправильно создаю анимацию ключевого кадра преобразования?

13
задан yipe 13 March 2012 в 17:34
поделиться