【发布时间】:2012-12-03 10:22:58
【问题描述】:
我正在尝试根据时间旋转具有各种子层的 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 的概念?我知道它是用来制作动画本身的。但我需要它对用户输入做出反应并立即更改。 感谢您的帮助。
【问题讨论】:
-
圆形图层是您创建的图层还是您的某个视图的图层?
标签: objective-c xcode core-animation calayer