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?

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
    }
}

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
    }
}

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");
    }  
}];
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.