2012-10-18 13 views
5

Uczę się Core Animation i wypróbowuję przykładowe przykłady.Czas trwania animacji w formacie CATransaction nie działa

Kiedy użyć następującego kodu, czas trwania animacji działa

@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 

Z drugiej strony, jeśli wrzuciłam kod metody Animacja na dole przycisk viewDidLoad tak, że dzieje się bez naciskania przycisków, czas trwania animacji nie jest przestrzegany. Po prostu widzę końcowy rezultat bez żadnej animacji.

Jakieś myśli?

Dzięki KMB

Odpowiedz

16

Oto informacja tracisz: istnieją dwahierarchii warstw w swojej aplikacji. Istnieje hierarchia warstw, na której zwykle pracujesz. Następnie znajduje się hierarchia warstw, która odzwierciedla zawartość ekranu. Spójrz na “Layer Trees Reflect Different Aspects of the Animation State” in the Core Animation Programming Guide, aby uzyskać nieco więcej informacji, lub (gorąco polecam) obejrzyj wideo Core Animation Essentials z WWDC 2011.

Cały napisany przez ciebie kod działa na warstwie modelu (tak jak powinien).

System dodaje niejawne animacje, gdy kopiuje zmienną wartość właściwości animacji z warstwy modelu do odpowiedniej warstwy prezentacji.

Tylko warstwy modelu znajdujące się w hierarchii widoku UIWindow otrzymują warstwy prezentacji. System wyśle ​​Ci viewDidLoad, zanim doda on do okna self.view, więc nie ma żadnych warstw prezentacji dla self.view lub twojej niestandardowej warstwy, gdy jest już uruchomiony viewDidLoad.

Jedną rzeczą, którą musisz zrobić, to zmienić właściwość później, po dodaniu widoku i warstwy do okna, a system utworzył warstwy prezentacji. viewDidAppear: jest wystarczająco późno.

- (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

Dzięki Rob. To się udało. Zgaduję, że te nawiasy wokół zaczynają się angażować, są opcjonalne. – Spectravideo328

+0

Klamry są opcjonalne. Lubię wcięcia kodu między 'begin' i' commit', a nawiasy klamrowe powodują, że Xcode automatycznie je wcina. –

+0

Mocno zastępuję wideo WWDC, które stanowi doskonałe wprowadzenie do wielu gier CoreAnimation. – MaxGabriel

Powiązane problemy