Я использовал CAKeyframeAnimations для анимации свойств слоя transform.rotation
и transform.translation.x
, но у меня возникли проблемы с анимацией свойства transform
неявно. У меня есть слой, который должен анимироваться между двумя состояниями, и интерполяция по умолчанию CABasicAnimation полностью неверна и не соответствует пути, который я хочу. CAKeyframeAnimation на помощь, или так я думал. Любая попытка анимации transform
с использованием CAKeyframeAnimation приводит к тому, что представление сразу же привязывается к окончательному преобразованию во время других анимаций. Если я удалю первую половину следующей функции и пусть мои «трансформирующие» события используют CABasicAnimation в нижней части, она оживляет просто отлично, хотя с неверно интерполированными преобразованиями на этом пути.Как я могу преобразовать CATransform3Ds с CAKeyframeAnimation?
Моего слой делегат осуществил следующее:
- (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;
}
Мое преобразование перевод следует повернуть, но я думаю, что группа анимация с отдельной ключевыми кадрами анимации анимации с помощью сдвига и поворот может привести к сумасшедшим город. Я подтвердил, что размер & transform верен для всех значений p, которые я прохожу, и p строго колеблется от 0 до 1.
Я попытался установить функцию синхронизации по умолчанию, я пробовал настройку массив временных функций, я опустил ключевые слова, я установил repeatCount из 0, removedOnCompletion = YES и fillMode forwards, и это не повлияло. Я не правильно создаю анимацию ключевого кадра трансформирования?
Не могли бы вы уточнить точный эффект, который вы пытаетесь достичь? Вы описываете его как перевод, за которым следует ротация, но из вашего кода это выглядит так, что границы также оживляют - это правильно?Вы хотите, чтобы слой перемещался, а затем вращался, с границами, постоянно растущими или сжимающимися на обеих фазах анимации move/rotate? – GSnyder
Почему это должно быть неявным? Этот код выглядит взломанным. Если вам нужен тонкий контроль, почему бы просто не создать анимацию и не добавить ее прямо к слою, о котором вы говорите, что у вас уже есть работа? Также просто верните 'nil' из этого метода делегата, если вы хотите, чтобы в них использовалась их анимация по умолчанию. –