Änderungen während der Drehung des Geräts basierend auf dem Element Größe werden nach Abschluss der Drehung animiert

8

Ich habe eine dynamische Anordnung von Schaltflächen, die automatisch in Breite und Höhe angepasst werden, basierend auf den in einem Storyboard festgelegten automatischen Layoutbeschränkungen. Im Hochformat haben die Tasten die gleiche Breite und Höhe, so dass der Rahmen perfekt quadratisch ist. Wenn das Gerät in Querformat gedreht wird, werden die Tasten kürzer und breiter. Ich habe cornerRadius auf den Ebenen der Buttons eingestellt, damit sie im Portrait perfekt kreisförmig sind und das funktioniert gut, aber wenn ich in die Landschaft rotiere, sieht der Eckenradius offensichtlich nicht mehr richtig aus. Ich muss das ändern, damit es ein Oval wird. Das Problem ist, egal wo ich diesen Code einfüge, kann ich nicht die richtige Breite und Höhe der Tasten erhalten, nachdem die Rotation auftritt. Ich möchte, dass dies geschieht, während das Gerät gedreht wird - ich möchte nicht warten, bis die Rotation abgeschlossen ist. Idealerweise würde cornerRadius die Änderung animieren, während der Übergang animiert.

Wenn ich viewWillLayoutSubviews oder viewDidLayoutSubviews verwende, wird der Button Frame beim Start der App korrekt angezeigt, aber beim Drehen in die Landschaft wird diese Methode aufgerufen, bevor der Rahmen der Schaltfläche für die neue Ausrichtung aktualisiert wird. t Berechne den richtigen Eckenradius.

Wenn ich viewWillTransitionToSize:withTransitionCoordinator: oder willTransitionToTraitCollection:withTransitionCoordinator: oder willRotateToInterfaceOrientation verwende, wird es beim Start der App nicht aufgerufen, und wenn das Gerät gedreht wird, wird es aufgerufen, bevor der Rahmen für die neue Größe aktualisiert wird.

Wenn ich willAnimateRotationToInterfaceOrientation verwende, wird es beim Start der App nicht aufgerufen, aber wenn das Gerät gedreht wird, erhält es den neuen Schaltflächenrahmen korrekt. Aber diese Methode ist veraltet.

Die Frage ist also, mit welcher Methode können Sie die Eigenschaften einer Schaltfläche basierend auf der Größe festlegen, die die Schaltfläche hat, wenn die Drehung abgeschlossen ist, die aufgerufen wird, bevor die Drehung abgeschlossen ist?

Beachten Sie, dass es für jede Orientierungsänderung aufgerufen werden muss, nicht nur für Änderungen der Größenklasse (das rotierende iPad ändert die Größenklasse nicht). Ich muss nur iOS 8.0 + unterstützen.

Dies ist der Code, den ich in die Methoden lege, um zu wissen, ob er die richtige Größe hat:

%Vor%     
Joey 01.02.2015, 03:42
quelle

2 Antworten

6

Im Folgenden skizziere ich, wie man mit CADisplayLink die Eigenschaften in jedem Frame der Animation aktualisieren kann, aber es gibt einen einfacheren Weg. Unterklasse die Schaltfläche (oder Ansicht oder was auch immer) mit einem layoutSubviews , das den Eckenradius aktualisiert:

%Vor%

Während der Animation wird der Eckenradius bei Änderung der Bildgröße automatisch aktualisiert:

Wie Joey hervorhebt, kann man viewWillTransitionToSize verwenden, um über die neue Größe benachrichtigt zu werden, und dann animateAlongsideTransition verwenden, um deine zusätzliche Animation zusammen mit der Hauptanimation zu koordinieren.

Wenn Sie eine nicht animierbare Eigenschaft animieren möchten, z. B. den Eckenradius (in blockbasierten Animationen sowieso), können Sie für die Dauer der Animation eine Anzeigeverbindung verwenden. Dies ruft unsere Methode für jedes Bild der Rotationsanimation auf. Daher haben wir eine Methode, die den Präsentations-Layer (der den aktuellen Status eines Layers mitten in der Animation anzeigt) zur schnellen Anpassung des Eckenradius betrachtet. Sie können dafür auch animateAlongsideTransition verwenden, aber wir verwenden in diesem Fall nicht die Schließung animation , sondern verwenden lediglich die completion -Verknüpfung, um zu wissen, wann die Animation fertig ist, und können daher die Anzeigeverbindung stoppen:

%Vor%

Ehrlich gesagt bin ich nicht sicher, ob diese Eckenradius-Animation ausreicht, um diese Anzeigeverbindung zu rechtfertigen (ich musste die Animationen im Simulator mit Befehl + T verlangsamen) schätze den Unterschied), aber dies illustriert die Grundidee.

    
Rob 01.02.2015, 04:53
quelle
4

Die Antwort lautet viewWillTransitionToSize:withTransitionCoordinator: , wobei der Code innerhalb des Animationsabschlusses der Methode UIViewControllerTransitionCoordinator von animateAlongsideTransition: platziert wird. Auf diese Weise können Sie die Änderungen basierend auf der Größe nach Abschluss der Drehung animieren.

%Vor%

Diese Methode wird nicht aufgerufen, wenn die App gestartet wird, daher sollten Sie auch self.updateButtonsCornerRadius() in viewDidLoad aufrufen.

    
Joey 01.02.2015 04:00
quelle