2

Я написал это CAKEyFrameAnimaton, чтобы повернуть CALayer на его оси X. Но он не вращается. Что я здесь делаю неправильно?iOS CAKeyFrameAnimation Rotate

CAKeyframeAnimation *topFoldAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.x"]; 
topFoldAnimation.duration    = 15; 
topFoldAnimation.repeatCount   = 1; 
topFoldAnimation.removedOnCompletion = NO; 
topFoldAnimation.autoreverses   = NO; 
topFoldAnimation.fillMode    = kCAFillModeForwards; 

CATransform3D tTrans     = CATransform3DIdentity; 
tTrans.m34       = -1/900; 

topFoldAnimation.values    = [NSArray arrayWithObjects: 
             [NSValue valueWithCATransform3D:CATransform3DRotate(tTrans,DEGREES_TO_RADIANS(0),1,0,0)], 
             [NSValue valueWithCATransform3D:CATransform3DRotate(tTrans,DEGREES_TO_RADIANS(-30),1,0,0)], 
             [NSValue valueWithCATransform3D:CATransform3DRotate(tTrans,DEGREES_TO_RADIANS(-60),1,0,0)], 
             [NSValue valueWithCATransform3D:CATransform3DRotate(tTrans,DEGREES_TO_RADIANS(-90),1,0,0)], 
              nil]; 
topFoldAnimation.keyTimes    = [NSArray arrayWithObjects: 
              [NSNumber numberWithFloat:0.00], 
              [NSNumber numberWithFloat:0.25], 
              [NSNumber numberWithFloat:0.50], 
              [NSNumber numberWithFloat:1.00], 
              nil]; 
topFoldAnimation.timingFunctions  = [NSArray arrayWithObjects: 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
              nil]; 
[[backgroundAnimationLayer.sublayers objectAtIndex:1] addAnimation:topFoldAnimation forKey:@"transform.rotation.x"]; 

Любая помощь приветствуется. Спасибо ...

ответ

1

Ваша анимация keyPath неверна, она должна быть только transform, а не transform.rotation.x.

Кроме того, вы получите 0 в tTrans.m34, потому что вы используете целочисленное деление. Вероятно, это должно быть -1.0/900.

+0

yes Я назначаю m34 для получения перспективы 2.5D. и почему subLayer? Если я применил его к слою, все подслои должны получить это преобразование, не так ли? –

+0

Правильно, я почему-то предполагал, что 'm34' только повлиял на' subLayerTransform', потому что я всегда использовал его таким образом, но это, похоже, не так. Тем не менее, вы фактически назначаете 0 здесь, что определенно не будет иметь желаемого эффекта. – omz

+0

прохладный. позвольте мне изменить это, посмотрим ... –

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