2016-07-22 39 views
-1

Ich habe die folgende Methode von ViewDidLoad aufgerufen. Diese Methode erstellt einen CALayer, um ein Bild anzuzeigen. Diese Ebene hat eine Maske, deren Pfad ein UIBezierPath ist, der von meiner privaten Methode erstellt wurde. Ich möchte, dass sich die Maske unendlich dreht, und dann füge ich ein CABasicAnimation-Objekt zur Maske hinzu.Warum addAnimation: forKey funktioniert nicht in viewDidLoaded

- (void) createPathLmask 
{ 
    // mask layer 
    self.pathLayer     = [CALayer layer]; 
    self.pathLayer.bounds   = CGRectMake(0.0, 0.0, 120, 120); 

    CGPoint position = self.view.layer.position; 
    position.y += 140; 
    self.pathLayer.position  = position; 
    self.pathLayer.backgroundColor = [UIColor redColor].CGColor; 

    UIImage *backimage = [UIImage imageNamed:@"image2"]; 
    self.pathLayer.contents = (__bridge id)backimage.CGImage; 
    self.pathLayer.contentsGravity = kCAGravityResizeAspectFill; 

    // mask 
    CAShapeLayer *mask = [CAShapeLayer layer]; 
    mask.bounds   = CGRectMake(0.0, 0.0, 120, 120); 
    mask.position  = CGPointMake(60.0f, 60.0f); 
    mask.contentsGravity = kCAGravityResizeAspectFill; 
    mask.path   = [self createBezierPathInRect:mask.bounds].CGPath; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     // rotate the mask repeatedly 
     CABasicAnimation *animation = [CABasicAnimation animation]; 
     animation.keyPath = @"transform.rotation"; 
     animation.duration = 4.0f; 
     animation.byValue = @(M_PI * 2); 
     animation.repeatCount = HUGE_VALF; 
     [mask addAnimation:animation forKey:@"rotation_repeatedly"]; 
    }); 

    self.pathLayer.mask = mask; 

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

Ich finde, dass die Rotation Animation kann nur funktionieren, wenn ich die addAnimation setzen: forKey in den dispatch_after Block mit 1 Sekunde Verzögerung. Wenn diese Codes aus dem Block verschoben werden, wird die Maske nicht gedreht.

Es muss also etwas nicht bereit sein, wenn die Animation zum Layer in viewDidLoaded hinzugefügt wird. Ich frage mich, was noch nicht fertig ist? Gibt es ein Dokument oder eine Erklärung über die geeignete Möglichkeit, die Animation hinzuzufügen?

Antwort

1

Also muss es etwas nicht bereit sein, wenn Animation auf die Schicht in viewDidLoaded

hinzugefügt wird

Richtig. Das ist viel zu früh für die Animation. Denken Sie daran, dass die Ansicht an diesem Punkt nur existiert und das ist alles; es ist nicht einmal ein Teil der Schnittstelle. Sie können eine Ansicht nicht animieren, die nicht Teil der Ansichtshierarchie ist. An diesem Punkt gibt es nichts zu animieren.

Die Ansicht wird zuerst Teil der Schnittstelle zwischen dem ersten Aufruf von viewWillAppear und dem ersten Aufruf von viewDidAppear. Das bedeutet "erscheinen" bedeutet (im Gegensatz zu was "geladen" bedeutet).

+0

Vielen Dank @matt für Ihre Antwort. Und ja, Sie haben recht, der geeignete Ort, um Animationen zu Layern hinzuzufügen, kann viewWillAppear oder viewDidAppear sein. Das Dokument von addAnimation: forKey sagt, dass diese API die Animation dem Renderbaum der Ebene hinzufügen wird. Wissen Sie, ob es ein Dokument gibt, das den Lebenszyklus der Ebene (oder der Backend-Ebene von UIView) und deren Darstellungsschicht und Renderebene beschreibt? Ich habe nichts von "View Controller Programming Guide" und "Core Animation" gefunden Programmieranleitung " –

+0

" ein Dokument, das den Lebenszyklus der Ebene (oder der Backend-Ebene von UIView) und ihrer Darstellungsschicht und Renderebene "Ich weiß nicht, was Sie mit ihrem" Lebenszyklus "meinen, beschreibt. Was genau möchten Sie wissen? Du könntest immer mein Buch lesen, nehme ich an: http://www.apeth.com/iOSBook/ch16.html http://www.apeth.com/iOSBook/ch17.html – matt

+0

Allerdings glaube ich, dass ich dein tatsächliches beantwortet habe Frage, habe ich nicht? – matt

-1

Es gibt großartige Dokumentation auf Apples Website here. Putting einfach obwohl in:

  • ViewWillAppear - diese Methode vor der Ansicht des aufgerufen wird View-Controller ist zu einer Ansichtshierarchie hinzugefügt werden, und vor allen Animationen zur Darstellung der Ansicht konfiguriert sind. Sie können diese Methode überschreiben, um benutzerdefinierte Aufgaben auszuführen, die der Anzeige der Ansicht zugeordnet sind. Sie können diese Methode beispielsweise verwenden, um die Ausrichtung oder den Stil der Statusleiste so zu ändern, dass sie mit der Ausrichtung oder dem Stil der darzustellenden Ansicht übereinstimmt.
+0

danke für deine antwort. Wahrlich, deine Verbindung ist nützlich für mich. Zumindest kann es Teil der Beschreibung sein, die hilft, den tiefen Mechanismus zu verstehen. Aber ich weiß nicht, warum jemand es abgelehnt hat. Lass mich etwas länger warten, um zu sehen, ob es weitere Erklärungen geben wird. –