如何应用复杂的 CALayer 转换更改?
How To Apply Complex CALayer Transform Changes?
我需要一个复杂的 UIView
连续动画,其中涉及设置 CATransform3D
需要计算的旋转和平移属性,因此无法选择标准动画。
我转向使用 CALayer
动画。还有这个:
self.displayLink = [self.window.screen displayLinkWithTarget:self selector:@selector(update:)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- (void)update:(CADisplayLink*)sender
{
CGFloat elapsedTime = sender.timestamp - self.lastTimestamp;
self.lastTimestamp = sender.timestamp;
self.rotation += elapsedTime * 0.1; // Factor determines speed.
// This is just example for SO post; the real animation is more complicated!
CATransform3D transform;
transform = CATransform3DMakeRotation(self.rotation, 1.0, 0.0, 0.0);
self.imageLayer.transform = transform;
}
这里 self.imageLayer
是一个 CALayer
,其 contents
已设置图像并作为子层添加到我的基本视图中。
它会旋转'a bit'但不是连续旋转,有时它似乎会停止或向后旋转一点。
似乎经常分配一个新的 transform
没有任何效果,因为 self.rotation
值增加了很多。添加 [self setNeedsDisplay]
没有帮助。
我还没有对 CALayer
s 做太多,所以我想我遗漏了一些非常基本的东西。试图找到它一段时间,但我找到的所有示例似乎都与我想要的相去甚远。
当您创建自己的图层然后修改其属性时,它会隐式地对它们进行动画处理(请参阅 “Animating Simple Changes to a Layer’s Properties”。您没有看到预期的更改,因为 Core Animation 正在对更改进行动画处理而不是立即应用它们.
您需要禁用隐式动画。有几种方法可以禁用它;参见 “Changing a Layer’s Default Behavior”. Or search stack overflow for “disable implicit animations”。这是一种方法:
NSDictionary *actions = @{ @"transform": [NSNull null] };
self.imageLayer.actions = actions;
只需执行一次,在您创建 imageLayer
.
的位置
我需要一个复杂的 UIView
连续动画,其中涉及设置 CATransform3D
需要计算的旋转和平移属性,因此无法选择标准动画。
我转向使用 CALayer
动画。还有这个:
self.displayLink = [self.window.screen displayLinkWithTarget:self selector:@selector(update:)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- (void)update:(CADisplayLink*)sender
{
CGFloat elapsedTime = sender.timestamp - self.lastTimestamp;
self.lastTimestamp = sender.timestamp;
self.rotation += elapsedTime * 0.1; // Factor determines speed.
// This is just example for SO post; the real animation is more complicated!
CATransform3D transform;
transform = CATransform3DMakeRotation(self.rotation, 1.0, 0.0, 0.0);
self.imageLayer.transform = transform;
}
这里 self.imageLayer
是一个 CALayer
,其 contents
已设置图像并作为子层添加到我的基本视图中。
它会旋转'a bit'但不是连续旋转,有时它似乎会停止或向后旋转一点。
似乎经常分配一个新的 transform
没有任何效果,因为 self.rotation
值增加了很多。添加 [self setNeedsDisplay]
没有帮助。
我还没有对 CALayer
s 做太多,所以我想我遗漏了一些非常基本的东西。试图找到它一段时间,但我找到的所有示例似乎都与我想要的相去甚远。
当您创建自己的图层然后修改其属性时,它会隐式地对它们进行动画处理(请参阅 “Animating Simple Changes to a Layer’s Properties”。您没有看到预期的更改,因为 Core Animation 正在对更改进行动画处理而不是立即应用它们.
您需要禁用隐式动画。有几种方法可以禁用它;参见 “Changing a Layer’s Default Behavior”. Or search stack overflow for “disable implicit animations”。这是一种方法:
NSDictionary *actions = @{ @"transform": [NSNull null] };
self.imageLayer.actions = actions;
只需执行一次,在您创建 imageLayer
.