iOS: So führen Sie eine Funktion aus, nachdem sich das Gerät gedreht hat (Swift)

70

Ich habe eine UIView, die kein automatisches Layout verwendet, und einige Komponenten werden basierend auf ihrem Prozentsatz der X- und Y-Koordinaten in der Hauptansicht angezeigt.

Früher hätte ich eine Funktion ausgeführt, um ihre Positionen in didRotateFromInterfaceOrientation zu aktualisieren, aber ich sehe, dass dies jetzt in iOS8 veraltet ist.

Ich habe mir viewWillTransitionToSize angesehen, aber es liefert seltsame Ergebnisse, und es scheint keine viewDidtransitionToSize-Funktion zu geben.

Gibt es eine einfache Möglichkeit (in Swift), eine Funktion nach einer Gerätedrehung auszuführen?

Richard
quelle

Antworten:

170

Die viewWillTransitionToSizeDelegate-Methode wird mit einem UIViewControllerTransitionCoordinatorkonformen Objekt aufgerufen . Eine vom Protokoll deklarierte Methode ist animateAlongsideTransition(_:animation, completion:). Sie können dies verwenden, um Code nach Abschluss des Übergangs ausführen zu lassen.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil) { _ in
        // Your code here
    }
}
Acey
quelle
Sollte nicht super.viewWillTransitionToSize:zuerst angerufen werden?
Behdad
Ja, natürlich, mein Schlechtes. Hinzugefügt. Vielen Dank!
Acey
Gibt es eine Möglichkeit, so etwas in einer Ansicht selbst aufzurufen, und nicht in der Steuerung?
ArielSD
1
@ArielSD Eine Ansicht sollte eher "dumm" sein und nur ihr Unteransichtslayout neu berechnen, da etwas (entweder direkt oder indirekt) setNeedsLayout aufgerufen hat. Wenn Sie bei einer Änderung der Ausrichtung etwas anderes als das Layout aktualisieren müssen, können Sie einen Verweis auf eine Ansicht beibehalten und die gewünschte Methode direkt aufrufen.
Acey
28

Die obige Antwort https://stackoverflow.com/a/26944087/6583492 ist dank Acey und Moonwalkr absolut richtig. Aber für Swift 3.0 sieht es wie folgt aus

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil) { _ in
        // Your code here
    }
}
daxh
quelle
1
Großartig, Sie müssen das entfernen; in Zeile 5
Ruben
Dies sollte ein Kommentar / eine Bearbeitung in seiner Antwort sein, kein Beitrag
Leo Dabus
18

Obwohl hier nicht gefragt Ziel C-Version:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {

    // change any properties on your views

} completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    if( UIDeviceOrientationIsPortrait(orientation) ) {
        NSLog(@"portrait");
    } else {
        NSLog(@"landscape");
    }  
}];
}
Olivier de Jonge
quelle