2016-11-04 5 views
11

Ich versuche, Rotation auf einem UIViewController zu verhindern, und das kann ich nicht erreichen.überschreiben shouldAutorotate funktioniert nicht in Swift 3

Ich mache so etwas wie dieses:

open override var shouldAutorotate: Bool { 
    get { 
     return false 
    } 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    get { 
     return .portrait 
    } 
} 

Und die UIViewControler Stills dreht. Der UIViewController befindet sich in einem modal geöffneten UINavigationController.

Ich habe eine Menge Fragen von hier aus und keine Antworten funktioniert für mich.

In Swift 2 habe ich shouldAutorotate überschrieben, aber in Swift 3 existiert diese Funktion nicht mehr.

Wie kann ich das in Swift 3 machen, was ich früher in Swift 2 gemacht habe?

+1

Wie sehen Ihre 'supportedInterfaceOrientations' aus? – matt

+0

@matt Ich habe die Frage bearbeitet, indem ich das hinzugefügt habe – pableiros

+0

Danke. Okay, wenn dies ein präsentierter View-Controller ist, sollte er nur im Hochformat erscheinen und dort bleiben. Wenn das nicht passiert, muss die Geschichte mehr erzählen. Können Sie beschreiben, wie dieser View-Controller dargestellt wird? Beweisen Sie mir, dass es sich um einen Full-Screen-Controller der obersten Ebene handelt. – matt

Antwort

22

Ich weiß nicht, warum ist eine Stimme, um die Frage zu schließen, wenn ich dieses Verhalten viele Male reproduzieren kann. Die UIViewController ist in einem UINavigationController modal geöffnet.

Dies ist, was ich getan habe, um das Problem zu lösen.

Ich schaffe diese Klasse und ich auf dem UINavigationController dass containt die UIViewController, die ich

class NavigationController: UINavigationController { 

    override var shouldAutorotate: Bool { 
     return false 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return .portrait 
    } 

} 

Und das ist es zu drehen, verhindern wollen, funktioniert es für mich

+0

aber was ist, wenn Sie nur einen bestimmten UIViewController wollen nicht rotieren und nicht den gesamten Navigationsstapel? Diese Antwort scheint wie eine bessere: http://StackOverflow.com/A/39805665 –

+0

@RoyShilkrot Es ist in Ordnung, das Ziel der Frage war, wie die Rotation von einem View-Controller in einem Navigationscontroller zu verhindern, nicht wie zu verhindern ein spezifischer View-Controller in einem ganzen Navigations-Stack – pableiros

3

diesen Code zu AppDelegate hinzufügen.

swift
var orientationLock = UIInterfaceOrientationMask.all 
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
    return self.orientationLock 
} 

struct AppUtility { 
    static func lockOrientation(_ orientation: UIInterfaceOrientationMask) { 
     if let delegate = UIApplication.shared.delegate as? AppDelegate { 
      delegate.orientationLock = orientation 
     } 
    } 

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) { 
     self.lockOrientation(orientation) 
     UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation") 
    } 
} 

zum Viewcontroller hinzufügen, die Ihnen eine Orientierung zwingen wollen:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    //let value = UIInterfaceOrientation.landscapeLeft.rawValue 
    //UIDevice.current.setValue(value, forKey: "orientation") 


    AppDelegate.AppUtility.lockOrientation(.landscapeLeft) 

} 
+0

Das funktioniert für mich, aber die angenommene Antwort ist viel sauberer und funktioniert auch.Gibt es ein spezifisches Szenario, in dem die angenommene Antwort nicht möglich ist und nur das funktioniert? – paul

Verwandte Themen