为了好玩,我一直试图在目标c中使用Xcode设置彩票轮类型对象。到目前为止,我已经能够通过随机旋转成功旋转对象,并停在方向盘上的8个项目中的一个。
问题是,我不知道如何“保存”旋转的动画层。每次旋转滚轮,一旦动画完成,它将重置并以原始方向显示图像。下面是我为旋转车轮设置的代码。 (注意:在这段代码中,我只是设置一个旋转。这是我正在尝试保留图像的模板。另一个代码在一个不同的项目中,存储停止点并将其更正为这些物体的中心。)
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
#define SPIN_CLOCK_WISE 1
#define SPIN_COUNTERCLOCK_WISE -1
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)spinButton:(id)sender {
[self spinLayer:_spinImage.layer duration:10 direction:SPIN_CLOCK_WISE];
}
- (void)spinLayer:(CALayer *)inLayer duration:(CFTimeInterval)inDuration
direction:(int)direction
{
CABasicAnimation* rotationAnimation;
// Rotate about the z axis
rotationAnimation =
[CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
// Rotate 360 degress, in direction specified
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 22.3 * direction];
// Perform the rotation over this many seconds
rotationAnimation.duration = inDuration;
// Set the pacing of the animation
rotationAnimation.timingFunction =
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// Add animation to the layer and make it so
[inLayer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
// Save animation
//%%%%%%%%%% THIS IS WHERE I AM STUCK!! %%%%%%%%%
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
如果有人可以帮我保留旋转图像,这样一旦spinLayer方法完成,图像保持旋转到新的旋转方向,我将非常感激。谢谢!
答案 0 :(得分:1)
令人困惑的部分是动画只是改变了图层的外观,而不是图层的属性。
您可以将动画视为在渲染时覆盖属性。
正如您所看到的,由于模型值从未改变,因此当动画完成并自行移除时,图层将返回以呈现该属性的实际值。
解决此问题的错误方法是永久保持动画。它确实产生了正确的渲染,但有一些不必要的副作用,因为现在“永久”的模型值与外观不匹配。
相反,更好的解决方案是在将动画添加到图层时更新要设置动画的属性的值。这可能会让它感觉它会破坏动画,但如果动画从旧值动画到新值,它将“覆盖”任何模型值为什么渲染,当动画移除时,结束值将匹配模型值
有关添加动画时更改模型值的位置以及动画应用方式的更深入讨论,请参阅this question和this blog post of mine。