2014-03-25 5 views
7

Ich habe eine UIView mit Unteransichten und möchte nur bestimmte Eigenschaften bestimmter Ansichten animieren. Zum Beispiel möchte ich manchmal [self layoutIfNeeded] aufrufen und nur die Grenzen animieren, aber nicht andere Eigenschaften der Ansicht oder ihrer Unteransichten.Bereich UIView Animationen zu bestimmten Ansichten oder Eigenschaften

Das Problem ist, dass +[UIView animateWithDuration:animations] Unteransichten und alle animierbaren Eigenschaften verfolgt. Gibt es dafür eine vernünftige Lösung?

Antwort

10

Werfen Sie einen Blick auf +[UIView performWithoutAnimation:]. Sie geben einen Block von Änderungen an, die Sie ohne Animation ausführen möchten, und sie werden sofort ausgeführt.

Dies ist gut für iOS7 und höher und nur für UIKit-Animation. Für mit Animationen auf Layer-Objekte handelt direkt, oder die Unterstützung für ältere Versionen von iOS, können Sie den folgenden Code verwenden:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
//Perform any changes that you do not want to be animated 
[CATransaction commit]; 

Mehr auf performWithoutAnimation:here und auf setDisabledActions:here.


Wenn Sie die Eltern-Code nicht ändern möchten, können Sie die Setter-Methoden der Eigenschaften implementieren können Sie den Super-Anruf mit performWithoutAnimation: nicht animiert werden soll, und wickeln, etwa so:

- (void)setFrame:(CGRect)frame 
{ 
    [UIView performWithoutAnimation:^{ 
     [super setFrame:frame]; 
    }]; 
} 
+0

Gibt es eine Möglichkeit zu aktivieren/deaktivieren, dass bestimmte Eigenschaften animiert werden? Zum Beispiel ändert '[self layoutIfNeeded]' den Rahmen der Ansicht, ändert aber auch die Rahmen seiner Unteransichten. Ich möchte UIKit anweisen, nur die Elternansicht, aber nicht die Untersichten zu animieren, ohne die Implementierung der Elternansicht zu ändern. – ide

+0

@ide Sie können die Subview-Implementierung von 'setXXX:' ändern, um sie in einen 'performWithoutAnimation:' -Block zu schreiben. Siehe Bearbeiten, um zu antworten. –

1

Wenn die Größe der Unteransichten nicht geändert werden soll, wenn sich die Grenzen der übergeordneten Ansicht ändern, sollten Sie die entsprechenden Unteransichten entsprechend festlegen und/oder das Flag autoresizesSubviews des übergeordneten Elements festlegen.

Andernfalls müssen Sie die layoutSubviews des übergeordneten Elements überschreiben und jeden Frame der Subviews auf die vorherigen Werte zurücksetzen.

1

Da Sie etwas komplexeres tun möchten als nur das Verschieben einer Ansicht, würde ich Ihnen absolut empfehlen, von UIKit auf Core Animation zu wechseln. Dadurch können Sie Animationen für bestimmte Schlüsselpfade für jedes Objekt erstellen.

Ich verspreche, es ist nicht so beängstigend, indem Sie ein paar CABasicAnimations erstellen und sie in einer CAAnimationGroup zusammenfassen, können Sie sie zu jedem CALayer von UIView hinzufügen. Dies wird definitiv die Kontrolle bieten, die Sie brauchen.

Verwandte Themen