Rotationsmethoden veraltet, entspricht 'didRotateFromInterfaceOrientation'?

137

Ich versuche, die neue viewWillTransitionToSizeMethode zu implementieren, die in iOS 8 eingeführt wurde (alle anderen Rotationsmethoden sind veraltet). Ich würde gerne wissen, was das Äquivalent von didRotateFromInterfaceOrientationjetzt ist, da wir eine Reihe von Bereinigungsaufgaben ausführen müssen und ich keinen Block sehen kann, dem wir zuweisen können, UIViewControllerTransitionCoordinatorum beim Übergang zu einem neuen aufgerufen zu werden Größe endet. Vielen Dank.

seltsam
quelle

Antworten:

255

Okay, ich habe es gefunden, muss nur die animateAlongsideTransition:completion:Methode für das Bestehen verwenden UIViewControllerTransitionCoordinator.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
seltsam
quelle
Wird diese Methode jedes Mal aufgerufen, wenn wir uns wie didRotateFromInterfaceOrientation drehen? Können Sie mir bitte die Methode mitteilen, die Sie verwendet haben? Vielen Dank
fragen
2
Ja, es wird. Dies ist, was ich tue: - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
seltsam
1
Danke - ich werde eine schnelle Version als Antwort hinzufügen, um den Leuten Zeit zu sparen
DogCoffee
3
Die Statusleistenorientierung ist in iOS 9 veraltet. Welche Option gibt es noch?
Deepak Sharma
1
@DeepakSharma Ich bin etwas spät zur Party, aber du kannst es benutzen [UIDevice currentDevice].orientation. Sie können dies auch in UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)oder leiten UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Hoffe das hilft!
Jeff
70

Die Swift-Version der Antwort von seltsam

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
DogCoffee
quelle
Es ist seltsam, weil ich dies in meinen ViewController eingefügt habe und es printnichts in mein Protokoll aufgenommen hat. Ich denke, weil diese Methode nicht aufgerufen wird. Können Sie sich noch etwas vorstellen, das eingesteckt werden müsste, damit dies funktioniert?
Reise
Ich habe es gerade einem leeren Projekt (Universal App) hinzugefügt und es funktioniert einwandfrei, ohne dass etwas hinzugefügt werden muss. Fügen Sie möglicherweise eine log-Anweisung ganz am Anfang der Methode ein und prüfen Sie, ob sie aufgerufen wird. Mir fällt nichts ein, was Sie hinzufügen müssten. Welches iOS laufen Sie?
DogCoffee
@ DogCoffee..es wird nicht angerufen. Hat das etwas mit Simulator zu tun?
Saty
@Saty funktioniert auch im Simulator - dann einfach nochmal überprüft. Funktioniert wie erwartet.
DogCoffee
1
Die Statusleistenorientierung ist in iOS 9 veraltet. Welche Option gibt es noch?
Deepak Sharma
10

iOS 10.3 & Swift 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }
Mike Glukhov
quelle
Warum brauchst du Animation? Können Sie 'newCollection' nicht sofort überprüfen?
Cyanid
@cyanide, zum der Animation mit meinem zu synchronisieren
Mike Glukhov
7

Die akzeptierte Antwort in Swift 3 :

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

Es funktioniert gut für mich 👍

j_gonfer
quelle
Funktioniert bei iOS 10 nicht - es druckt die alte Ausrichtung, nicht die neue.
Vaddadi Kartick
1
@ VaddadiKartick, weil Sie verwenden solltenlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov
5

Da war die Frage: Was war das Äquivalent von didRotateFromInterfaceOrientation

Ich dachte, ich würde den folgenden Code beisteuern:

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

Ich habe im Simulator auf einem iPhone getestet, aber meine Druckanweisungen werden nicht ausgeführt, wenn ich sie mit dem iPad teste, da sich die Eigenschaftssammlung nicht ändert.

Dies ist seltsam, da Apple genau dies empfiehlt :

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}
NYC Tech Engineer
quelle
Es gibt eine fehlende Klammer im zweiten Code-Snippet
Anton Duzenko
Funktioniert dies auf dem iPad, wo sowohl vertikale als auch horizontale Klassen im Vollbildmodus regulär sind?
Deepak Sharma
Ihr Code ist nicht mit dem von Apple identisch. Sie testen nur die vertikale Größenklasse.
ADG
Es ist schon eine Weile her, anscheinend hat sich der Inhalt des Links geändert.
NYC Tech Engineer
3

[[UIApplication sharedApplication] statusBarOrientation]ist in iOS9 veraltet, müssen Sie für verschiedene Geräte gegen UITraitCollection testen .

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }
Yannick
quelle
6
Nur der Setter war veraltet. Ein Apple-Mitarbeiter schrieb: "Das Lesen der Ausrichtung in der Statusleiste ist nicht veraltet, sondern nur das Schreiben. Es war möglicherweise ein Fehler bei der Erstellung des Headers, wenn Sie dies auf dem Getter sehen." ( forums.developer.apple.com/thread/12937 )
Graham Perks
Ist der Getter nicht auch veraltet? Laut Dokumentation ist es.
Groot
0

Auf dem iPad gibt es keine Änderung der Merkmalssammlung. So erkennen Sie die Rotation von Anfang bis Ende. Hier ist die Swift 5-Syntax:

override func viewWillTransition(to size: CGSize, with coordinator: 
UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
Avi Pogrow
quelle