2015-01-22 3 views
6

ich zur Zeit lese Apples Core Animation Guide, wo ich die folgende Passage in Bezug auf Schicht-backed Ansichten in iOS gefunden:Warum zeigen Dokumente an, dass CALayer-Animationen in UIView-Animationsblöcken enthalten sein müssen?

Wenn Sie Animationen Core Animation-Klassen verwenden möchten zu initiieren, müssen Sie alle Ihre Core Animation Anrufe ausgeben von innen ein sichtbasierter Animationsblock. Die UIView-Klasse deaktiviert Ebenenanimationen standardmäßig, aktiviert sie jedoch wieder in Animationsblöcken. Änderungen, die Sie außerhalb eines Animationsblocks vornehmen, werden nicht animiert.

Direkt unter dem Angebot umfasst die Dokumentation den folgenden Code Eintrag:

[UIView animateWithDuration:1.0 animations:^{ 
    // Change the opacity implicitly. 
    myView.layer.opacity = 0.0; 

    // Change the position explicitly. 
    CABasicAnimation* theAnim = [CABasicAnimation animationWithKeyPath:@"position"]; 
    theAnim.fromValue = [NSValue valueWithCGPoint:myView.layer.position]; 
    theAnim.toValue = [NSValue valueWithCGPoint:myNewPosition]; 
    theAnim.duration = 3.0; 
    [myView.layer addAnimation:theAnim forKey:@"AnimateFrame"]; 
}]; 

was bedeutet, dass beide impliziten und expliziten Animationen auf CALayer s Unterstützung UIView s innerhalb eines Animationsblock platziert werden müssen.

Allerdings habe ich festgestellt, dass dies offensichtlich unwahr ist. Insbesondere habe ich explizite Animationen mit Core-Animation-Klassen außerhalb eines UIView Animationsblocks implementiert.

Habe ich diese Passage missverstanden oder ist sie veraltet oder etwas anderes?


Einige zusätzliche Anmerkungen:

Ich gehe davon aus, dass „die UIView Klasse von Standard-Layer-Animationen deaktiviert aber reaktiviert sie innerhalb Animation Blöcke“ bezieht sich auf die +[UIView setAnimationsEnabled:] Methode. Wenn ich zu einem Computer zurückkomme, der das tun kann, überprüfe ich, ob +[UIView areAnimationsEnabled]YES oder NO zurückgibt.

Antwort

4

Dieses Zitat bezieht sich auf den Layer, der die Ansicht unterstützt. Dies gilt nicht für eigenständige Layer, die Sie selbst erstellen und verwalten.


Jede Ansicht auf iOS wird durch eine Ebene unterstützt. Wenn Sie die Eigenschaften der Ansicht ändern, ändert sich die zugrunde liegende Ebeneneigenschaft. Standardmäßig hat der Layer implizite Animationen, aber der Layer "deaktiviert" dieses Verhalten, außer wenn Sie sich in einem UIView-Animationsblock befinden. Darauf bezieht sich dieser Teil der Dokumentation.

Es gibt verschiedene Möglichkeiten, wie Sie die Core-Animation zum Animieren einer Layer-Eigenschaft verwenden können. Am häufigsten wird das Animationsobjekt zum Layer hinzugefügt, wenn Sie die Eigenschaft animieren möchten. Sie können jedoch auch Anpassungen über das actions Wörterbuch und das styles Wörterbuch vornehmen, wenn Sie immer animieren möchten, wenn sich eine Eigenschaft ändert. Die letzten beiden wären auch für die Ebene deaktiviert, die eine Ansicht unterstützt.

+0

Sie sagen also, dass UIView * implizite * Animation auf ihren Backing-Layern deaktiviert (außer in 'UIView' Animationsblöcken), aber weiterhin explizite Animationen erlaubt? Wenn dies der Fall ist, unterscheidet sich dies von der Dokumentation, die besagt, dass * alle * CA-Aufrufe innerhalb eines Animationsblocks sein müssen. – ravron

+0

Wenn das ist, was es dann sagt, ist es falsch/schlecht formuliert. Das ist absolut nicht wahr. –

+0

@ravron Dieser Abschnitt befindet sich unter "So animieren Sie Layer-unterstützte Ansichten". Für mich war es offensichtlich, dass es sich um Layer handelt, die eine UIView unterstützen. –

Verwandte Themen