Frage willRotateToInterfaceOrientation ist veraltet, aber ich verstehe viewWillTransitionToSize nicht: withTransitionCoordinator:


Ich portiere meine iPad App auf iOS8 und Swift.

Im Hochformat benutze ich einen root UIViewController und wenn das de Gerät in den Querformat gedreht wird, segne ich zu einem anderen UIViewController. Ich habe 2 Lösungen entwickelt, eine basierend auf UIDevice-Benachrichtigungen und die andere auf willRotateToInterfaceRotation. Ich versuche immer, mich vom Observer-Muster fernzuhalten, es ist nur eine Angewohnheit von mir.

Der Observer funktioniert gut, aber die Überschreibung in beiden UIViewController von func willRotateToInterfaceOrientation (toInterfaceOrientation: UIInterfaceOrientation, Dauer: NSTimeInterval) sieht sauberer für meine Augen aus;)

Aber jetzt in iOS8 ist diese Funktion veraltet und ich sollte verwenden

func viewWillTransitionToSize(_ size: CGSize,
    withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

Aber ich habe keine Ahnung, wie ich damit arbeiten kann, um das gleiche Ergebnis zu erzielen.

Dies ist das rootViewController:

      override func willRotateToInterfaceOrientation(
                     toInterfaceOrientation: UIInterfaceOrientation, 
                                   duration: NSTimeInterval) {

      if (toInterfaceOrientation == UIInterfaceOrientation.LandscapeLeft ||                     
         toInterfaceOrientation == UIInterfaceOrientation.LandscapeRight) {

            self.performSegueWithIdentifier("toLandscape", sender: self)

      }

    }

und das UIViewControllerLanscape:

override func willRotateToInterfaceOrientation(
             toInterfaceOrientation: UIInterfaceOrientation, 
                           duration: NSTimeInterval) {

    if (toInterfaceOrientation == UIInterfaceOrientation.Portrait || 
        toInterfaceOrientation == UIInterfaceOrientation.PortraitUpsideDown) {

        self.presentingViewController?.dismissViewControllerAnimated(true,
                                                               completion: nil)

    }
}

Ich mag es nicht, veraltete Funktionen zu verwenden, also bin ich im Zweifel, was ich tun soll ... geh für den Beobachter oder was?

Dies ist der Code, den ich verwende, wenn (nur) der Stamm UIViewController ein Beobachter der UIDeviceOrientationDidChangeNotification ist:

 override func awakeFromNib() {
    let dev = UIDevice.currentDevice()
    dev.beginGeneratingDeviceOrientationNotifications()

    let nc = NSNotificationCenter.defaultCenter()
    nc.addObserver(self, selector: "orientationChanged:", name: UIDeviceOrientationDidChangeNotification, object: dev) 
 }

 func orientationChanged(note: NSNotification) -> () {
    if let uidevice: UIDevice = note.object? as? UIDevice {

        switch uidevice.orientation {
        case .LandscapeLeft, .LandscapeRight:
                self.performSegueWithIdentifier("toLandscape", sender: self)
        default:
            self.dismissViewControllerAnimated(true, completion: nil)
        }
    }
}

Ich mag Ihre Ideen, wie Sie eine Lösung für diese veralteten Funktionen erstellen können. Es ist ein totales Rätsel für mich .... oder vielleicht ist der Observer jetzt die bessere Lösung. Bitte teilen Sie Ihre Ideen.

Grüße,

jr00n


7
2017-09-27 14:40


Ursprung


Antworten: