2012-10-18 65 views
5

我正在學習Core Animation並試用示例示例。CATransaction設置動畫持續時間不起作用

當我使用下面的代碼時,動畫的持續時間工作

@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 

在另一方面,如果我在viewDidLoad中按鈕,以便它發生不按壓任何按鈕的底部集總的動畫的方法的代碼,動畫持續時間不受尊重。我只看到沒有任何動畫的最終結果。

有什麼想法?

感謝 九巴

回答

16

這裏就是你缺少的信息:有在你的應用程序層的層次結構。有模型層次結構,您通常使用它。然後是演示圖層層次結構,它反映了屏幕上的內容。看看「Layer Trees Reflect Different Aspects of the Animation State」 in the Core Animation Programming Guide瞭解更多信息,或者(強烈推薦)觀看來自WWDC 2011的Core Animation Essentials視頻。

您編寫的所有代碼都在模型圖層上運行(它應該如此)。

當系統從模型層中將更改的動畫屬性值複製到相應的表示層時,系統會添加隱式動畫。

只有在UIWindow的視圖層次結構中的模型圖層才能獲取表示層。在將self.view添加到窗口之前,系統會向您發送viewDidLoad,因此當viewDidLoad正在運行時,self.view或您的自定義層沒有表示層。

所以你需要做的一件事就是稍後改變屬性,在視圖和圖層被添加到窗口並且系統已經創建了表示層之後。 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]; 
} 
+0

感謝羅布。這工作。我猜這些括號開始提交是可選的。 – Spectravideo328

+0

大括號是可選的。我喜歡縮進'begin'和'commit'之間的代碼,並且大括號使Xcode自動縮進它。 –

+0

我強烈推薦參考WWDC視頻 - 這是一個很好的介紹了CoreAnimation的許多陷阱。 – MaxGabriel