CATransaction设置动画持续时间不起作用

时间:2012-10-18 01:53:28

标签: ios opengl-es core-animation calayer viewdidload

我正在学习核心动画并尝试示例。

当我使用以下代码时,动画持续时间有效

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

//Modifying base layer
self.view.layer.backgroundColor = [UIColor orangeColor].CGColor;
self.view.layer.cornerRadius = 20.0;
self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20);

//Adding layer
mylayer=[CALayer layer]; //mylayer declared in .h file
mylayer.bounds=CGRectMake(0, 0, 100, 100);
mylayer.position=CGPointMake(100, 100); //In parent coordinate
mylayer.backgroundColor=[UIColor redColor].CGColor;
mylayer.contents=(id) [UIImage imageNamed:@"glasses"].CGImage;

[self.view.layer addSublayer:mylayer];
}


- (IBAction)Animate //Simple UIButton
{
[CATransaction begin];

// change the animation duration to 2 seconds
[CATransaction setValue:[NSNumber numberWithFloat:2.0f] forKey:kCATransactionAnimationDuration];

mylayer.position=CGPointMake(200.0,200.0);
mylayer.zPosition=50.0;
mylayer.opacity=0.5;

[CATransaction commit];
}
@end

另一方面,如果我将Animate方法代码集中在ViewDidLoad按钮的底部,以便在不按任何按钮的情况下发生,则不会遵守动画持续时间。我只是看到了没有任何动画的最终结果。

有什么想法吗?

由于 KMB

1 个答案:

答案 0 :(得分:16)

以下是您缺少的信息:您的应用中有两个图层层次结构。有模型层次结构,您通常会对其进行操作。然后是表示层次结构,它反映了屏幕上的内容。请查看“Layer Trees Reflect Different Aspects of the Animation State” in the Core Animation Programming Guide以获取更多信息,或者(强烈推荐)观看来自WWDC 2011的Core Animation Essentials视频。

您编写的所有代码都在模型层上运行(应该如此)。

系统在将已更改的可动画属性值从模型图层复制到相应的表示层时,会添加隐式动画。

只有UIWindow视图层次结构中的模型图层才能获得表示层。在将viewDidLoad添加到窗口之前,系统会向您发送self.view,因此self.view正在运行时,viewDidLoad或您的自定义图层没有表示层。

因此,您需要做的一件事是在将视图和图层添加到窗口并且系统已创建表示层之后,稍后更改属性。 viewDidAppear:已经足够晚了。

- (void)viewDidLoad {
    [super viewDidLoad];

    //Modifying base layer
    self.view.layer.backgroundColor = [UIColor orangeColor].CGColor;
    self.view.layer.cornerRadius = 20.0;
    self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20);

    // Adding layer
    mylayer = [CALayer layer]; //mylayer declared in .h file
    mylayer.bounds = CGRectMake(0, 0, 100, 100);
    mylayer.position = CGPointMake(100, 100); //In parent coordinate
    mylayer.backgroundColor = [UIColor redColor].CGColor;
    mylayer.contents = (id)[UIImage imageNamed:@"glasses"].CGImage;    
    [self.view.layer addSublayer:mylayer];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [CATransaction begin]; {
        [CATransaction setAnimationDuration:2];
        mylayer.position=CGPointMake(200.0,200.0);
        mylayer.zPosition=50.0;
        mylayer.opacity=0.5;
    } [CATransaction commit];
}