我试图根据时间旋转具有各种子层的 CALayer。有 UDP 多播接收器将接收新的时间码。我通过计时器获取新时间:
[NSTimer scheduledTimerWithTimeInterval:0.02f
target:self
selector:@selector(fetchNewTimeAndRotate)
userInfo:nil
repeats:YES];
CALayer 应该根据时间旋转。就我而言,1.8 秒内旋转一圈。其实我不需要任何动画,我只需要经常设置角度,以便它产生实际的动画。
我试过以各种方式设置图层旋转:
第一次我尝试通过 CATransform3DMakeRotation:
CATransform3D rotation1 = CATransform3DMakeRotation([self DegreesToRadians:newAngle], 0.0f, 0.0f, 1.0f);
self.circleLayer.transform=rotation1
第二次尝试是通过动画使用即时旋转:
rotation.fromValue = [NSNumber numberWithFloat:[self DegreesToRadians:oldAngle]];
rotation.toValue = [NSNumber numberWithFloat:[self DegreesToRadians:newAngle]];
rotation.duration = 0.0f;
rotation.repeatCount = 0.0f;
rotation.removedOnCompletion = NO; //also used YES here with no effect
[self.circleLayer addAnimation:rotation forKey:@"transform.rotation.z"];
oldAngle=newAngle;
第三次尝试只是为“transform.rotation.z”设置一个角度
[self.circleLayer setValue:[NSNumber numberWithFloat:[self DegreesToRadians:newAngle]] forKeyPath:@"transform.rotation.z"];
上述所有方法都有效,但会导致轮换出现明显的卡顿。我已经尝试在获取和动画长度中使用几种不同的时间。似乎没有什么能摆脱这个问题。使用每 0.02 次自转和 3.6° 角是唯一能为我呈现平滑结果的选项。我在这里犯了一个根本性的错误还是不理解 CoreAnimation 的概念?我知道它是用来制作动画本身的。但我需要它对用户输入做出反应并立即更改。我感谢任何帮助。