gpt4 book ai didi

ios旋转动画与CGAffineTransform Rotate

转载 作者:行者123 更新时间:2023-11-29 03:05:51 25 4
gpt4 key购买 nike

我想执行一些旋转动画。现在我这样做:

#define degreesToRadians(x) (M_PI * x / 180.0)

[self.crossButton setTransform:CGAffineTransformRotate(self.crossButton.transform, degreesToRadians(-rotationDegree))];

但是当我通过 360 度时,什么也没有发生。当我将值传递到 180 以上时,它开始无法正常工作。你知道我做错了什么吗?

最佳答案

您的问题是“setTransformation”与矩阵旋转一起使用。因此,您将始终以最短的方式到达最终结果。当你传入一个360度旋转的时候,你的物体在变换之后还是一样的。出于这个原因,转换将什么都不做,因为它已经到了它应该结束的地方。对于 180 到 360 度之间的值,您的旋转将再次“向后”。旋转使用到达最终结果的“最短”路径。

你可以试试这段代码:

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) {

}];

确保将 VIEW_TO_ROTATEDEGREESTOTAL_ANIMATION_TIME 替换为您需要的值!

关于ios旋转动画与CGAffineTransform Rotate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22783118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com