gem*_*der 12 core-animation objective-c ios
[CATransaction begin];
[CATransaction setAnimationDuration:5];
CGAffineTransform currentTransform = squareLayer.affineTransform;
CGFloat angle = M_PI;
squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle);
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)
和
[CATransaction begin];
[CATransaction setAnimationDuration:5];
CGAffineTransform currentTransform = squareLayer.affineTransform;
CGFloat angle = (M_PI * -1);
squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle);
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)
我原本以为-1会扭转方向,但显然不是?
Rad*_*aid 15
角度是一样的.要完整的圆圈你需要2*Pi,所以半圈是Pi.如果你拿-Pi它会在同一点结束.
编辑:如果你需要顺时针转动,你可以略微离开-Pi.而不是-M_PI使用-3.141593例如.
刚碰到这个,虽然@ radicalraid的解决方案工作正常,我更喜欢在旋转之前调整起始角度,然后旋转到小于所需终点的角度.此外,您可以CALayer
使用动画块为变换设置动画.
我的代码:
// iOS will rotate the shortest distance to the end angle,
// using counter-clockwise if equal.
// Force the rotation to open clockwise and close counter-clockwise by bumping
// the initial angle
CGFloat startRadians, endRadians;
if (isOpening) {
startRadians = 0.01f;
endRadians = M_PI;
}
else {
startRadians = M_PI - 0.01f;
endRadians = 0.0f;
}
self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(startRadians);
[UIView animateWithDuration:0.3f
animations:^{
self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(endRadians);
}];
Run Code Online (Sandbox Code Playgroud)
我对Core animatinon的经验与Apple引用不一致.我发现,唯一重要的是最终的角度值.正pi和负pi旋转导致相同的变换矩阵,因此系统无论如何都只是逆时针.
我在特定方向上旋转或完整旋转360度所做的是使用类似transform.rotation.z创建显式CABasicAnimation,填充模式设置为kCAFillModeForwards,并且仅提供toValue .这会导致动画从之前的值开始.然后,您可以设置一个旋转,该旋转是您所需旋转总量的偶数部分,并给它重复计数.
例如,下面的代码创建一个旋转5个四分之一圈或450度的动画.如果你想顺时针旋转180度,你可以旋转pi/2,重复次数为2.对于逆时针,使用-pi/2,重复次数为2.
CABasicAnimation* rotate = [CABasicAnimation animationWithKeyPath:
@"transform.rotation.z"];
rotate.removedOnCompletion = FALSE;
rotate.fillMode = kCAFillModeForwards;
//Do a series of 5 quarter turns for a total of a 1.25 turns
//(2PI is a full turn, so pi/2 is a quarter turn)
[rotate setToValue: [NSNumber numberWithFloat: -M_PI / 2]];
rotate.repeatCount = 5;
rotate.duration = duration/rotate.repeatCount * 2 ;
rotate.beginTime = start;
rotate.cumulative = TRUE;
rotate.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8817 次 |
最近记录: |