1

Я пытаюсь анимировать свойство вида transform. Вот мой код:Ошибка CAKeyframeAnimation Keypath

CAKeyframeAnimation *shakeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 
NSArray *transformValues = [NSArray arrayWithObjects: 
         [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation((3*M_PI)/8)], 
         [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(-((3*M_PI)/8))], 
         [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation((3*M_PI)/8)], 
         [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(-((3*M_PI)/8))], 
         [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation((3*M_PI)/8)], 
         [NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(-((3*M_PI)/8))], 
         nil]; 

[shakeAnimation setValues:transformValues]; 

NSArray *times = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.16f],[NSNumber numberWithFloat:0.33f],[NSNumber numberWithFloat:0.49f],[NSNumber numberWithFloat:0.66f],[NSNumber numberWithFloat:0.82f], [NSNumber numberWithFloat:1.0f], nil]; 

[shakeAnimation setKeyTimes:times]; 

NSArray *timingFunctions = [NSArray arrayWithObjects: 
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut], 
nil]; 

[shakeAnimation setTimingFunctions:timingFunctions]; 

shakeAnimation.fillMode = kCAFillModeForwards; 
shakeAnimation.removedOnCompletion = NO; 
shakeAnimation.duration = 1.0f; 

[self.someView.layer addAnimation:shakeAnimation forKey:@"anim"]; 

По некоторым причинам, я получаю сообщение об ошибке, когда я установить параметр метода animationWithKeyPath: «преобразовать». Я пробовал полчаса, чтобы отладить это, но не могу найти ошибку. Первоначально я хотя, что я выполнял анимации не допускается на имущество превратить UIView, но я знаю, что я могу сделать что-то вроде этого:

aView.transform = CGAffineTransformMakeRotation(M_PI/2); 

Благодаря передовой.

ответ

4

Значением свойства transform слоя является CATransform3D, а не CGAffineTransform.

Кроме того, вам может быть проще анимировать путь ключа transform.rotation.z. Это значение равно CGFloat, поэтому вам не нужно создавать матрицу преобразования вообще.

“Modifying a Transform Using Key Paths” in Core Animation Programming Guide
“Key Path Support for Structure Fields” in Core Animation Programming Guide

+0

Вы правы! Я думал о представлении 'transform'. Спасибо. Кроме того, значение 'CGFloat', которое принимает путь ключа' transform.rotation.z', представляет собой? Угол (если это радиан или градусы)? – pasawaya

+0

Nevermind. Я проверил вашу ссылку. Это угол вращения в радианах. – pasawaya

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