2012-10-18 10 views
5

Ich lerne Core Animation und probiere Beispielbeispiele aus.CATransaction Einstellung Animationsdauer funktioniert nicht

Wenn ich den folgenden Code verwenden, funktioniert die Animation Dauer

@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 

Auf der anderen Seite, wenn ich das Animieren Methode Code am unteren Rand der Schaltfläche ViewDidLoad in einen Topf geworfen, so dass es ohne Drücken einer beliebigen Tasten geschieht, Die Animationsdauer wird nicht berücksichtigt. Ich sehe nur das Endergebnis ohne jede Animation.

Irgendwelche Gedanken?

Dank KMB

Antwort

16

Hier ist die Informationen, die Sie fehlen: Gibt es zwei Schicht Hierarchien in Ihrer Anwendung. Es gibt die Modell Schichthierarchie, auf der Sie normalerweise arbeiten. Dann gibt es die Präsentation Schicht Hierarchie, die widerspiegelt, was auf dem Bildschirm ist. Werfen Sie einen Blick auf “Layer Trees Reflect Different Aspects of the Animation State” in the Core Animation Programming Guide für ein bisschen mehr Informationen, oder (sehr empfehlenswert) sehen Sie sich das Core Animation Essentials Video von WWDC 2011.

Der gesamte Code, den Sie geschrieben haben, funktioniert auf der Modellschicht (wie es sollte).

Das System fügt implizite Animationen hinzu, wenn ein geänderter animierbarer Eigenschaftswert von einer Modellschicht in die entsprechende Darstellungsschicht kopiert wird.

Nur Modellschichten, die in einer Ansichtshierarchie UIWindow sind, erhalten Präsentationsebenen. Das System sendet Ihnen viewDidLoad, bevor es self.view zu dem Fenster hinzugefügt hat, also gibt es keine Präsentationsebenen für self.view oder Ihre benutzerdefinierte Schicht noch, wenn viewDidLoad ausgeführt wird.

Sie müssen also die Eigenschaft später ändern, nachdem die Ansicht und der Layer zum Fenster hinzugefügt wurden und das System die Präsentationsebenen erstellt hat. Die ist spät genug.

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

Dank Rob. Das hat funktioniert. Ich vermute, diese Klammern um Begin zu begehen sind optional. – Spectravideo328

+0

Die Klammern sind optional. Ich mag es, den Code zwischen dem 'begin' und dem' commit' einzurücken, und die geschweiften Klammern lassen Xcode automatisch einrücken. –

+0

Ich beziehe mich stark auf das referenzierte WWDC-Video - es ist eine ausgezeichnete Einführung in die vielen Fälle von CoreAnimation. – MaxGabriel

Verwandte Themen