转载自:
http://stackoverflow.com/questions/22783118/ios-rotation-animation-with-cgaffinetransformrotate
I want to perform some rotation animation. Right now I do it like that:
#define degreesToRadians ( x ) ( M_PI * x / 180.0 )
[ self . crossButton setTransform : CGAffineTransformRotate ( self . crossButton . transform , degreesToRadians (- rotationDegree ))];
but when I pass for instance 360 degrees nothong happens. When I pass value above 180 it starts not wokring well. Do you know what im doing wrong?
Your problem is that 'setTransformation' works with matrix rotation. For this reason you will always get the shortest way to the end result. When you pass in a 360 degree rotation, your object will be the same after the transformation. For this reason, the transformation will just do nothing, since it is already where it is supposed to end up. For values between 180 and 360 degrees your rotation will be 'backwards', since again. The rotation uses the 'shortest' path to the end result.
You can try this code:
UIView * toRotate = VIEW_TO_ROTATE ;
CGFloat degreesToRotate = DEGREES ;
CGFloat animationTime = TOTAL_ANIMATION_TIME ;
NSInteger intervals = (( int ) degreesToRotate )/ 179.9 ;
CGFloat rest = degreesToRotate -( intervals * 179.9 );
CGFloat radInterval = degreesToRotate >= 0 ? 179.9 :- 179.9 ;
CGFloat radRest = ( M_PI * rest / 180.0 );
CGFloat intervalTime = ( 1 -( radRest / M_PI / 2 ))/ intervals ;
CGFloat restTime = ( radRest / M_PI / 2 )/ intervals ;
[ UIView animateKeyframesWithDuration : animationTime
delay : 0.0f
options : UIViewKeyframeAnimationOptionCalculationModeLinear
animations :
^{
for ( int i = 0 ; i < intervals ; i ++) {
[ UIView addKeyframeWithRelativeStartTime : intervalTime * i relativeDuration : intervalTime animations :^{
toRotate . transform = CGAffineTransformConcat ( toRotate . transform , CGAffineTransformMakeRotation ( radInterval ));
}];
}
[ UIView addKeyframeWithRelativeStartTime : intervalTime * intervals relativeDuration : restTime animations :^{
toRotate . transform = CGAffineTransformConcat ( toRotate . transform , CGAffineTransformMakeRotation ( radRest ));
}];
} completion :^( BOOL finished ) {
}];
Make sure to replace VIEW_TO_ROTATE
,DEGREES
and TOTAL_ANIMATION_TIME
with the values you need!