2

Hallo Ich versuche, die Autorotation in einem der View-Controller in meinem Projekt zu stoppen. Im Snap unten gedreht, enter image description hereBildschirmausrichtung in Swift 4 für UINavigationController und UIViewController deaktivieren

Ich habe einen Start UINavigationController und dann ein UIViewController. Ich habe den folgenden Code implementiert, um die Autorotation zu stoppen:

extension UINavigationController { 

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

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{ 
     get { 
      return UIInterfaceOrientationMask.landscape 
     } 
    }} 

class ViewController: UIViewController { 

    @IBOutlet weak var imageView: UIImageView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override open var shouldAutorotate: Bool { 
     return false 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask 
    { 
     return .landscape 
    } 
    } 

Aber der obige Code scheint nicht zu nennen und keine Wirkung nehmen. Ich verwende Xcode 9 und swift 4.0. Jeder Vorschlag wäre willkommen.

Grüße, neena

+0

Sie haben ändern Sie Ihre 'Info.plist' Zugabe des 'UISupportedInterfaceOrientations'? –

+0

wenn ich die info.plist ändern würde dann wäre es für die gesamte Anwendung ich denke, aber ich möchte dieses Verhalten in einigen View-Controller nicht alle über die Anwendung. – neena

+0

'UISupportedInterfaceOrientations': gibt die von der App unterstützten Schnittstellenausrichtungen an. –

Antwort

1

Erstellen Sie eine Klasse und es UINavigationController gesetzt ist, dann diese neue Klasse verwenden in Ihrem Storyboard/XIB

In Ihrer Erweiterung:

class NavigationController: UINavigationController {  
    override var shouldAutorotate: Bool { 
     return topViewController?.shouldAutorotate ?? super.shouldAutorotate 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return topViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations 
    } 
} 

In Ihrem Controller:

override var shouldAutorotate: Bool { 
    return false 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    return .portrait 
} 
+0

Es funktioniert nicht :(. Ich habe all diesen Code an Ort und Stelle und wenn ich mein Gerät drehen seine Ausrichtung ändern. – neena

+0

Bitte siehe bearbeiten – TagTaco

+0

Ich weiß nicht, was los ist.Auch die bearbeitete Version funktioniert nicht. Ich habe versucht, es zu debuggen. Der Bruchpunkt kommt nie auf den zwei Eigenschaften. – neena

0

Ich war das gleiche Problem haben. Ich schaute über den gesamten Stack-Überlauf und probierte viele der Lösungen aus, und keiner von ihnen funktionierte. Ich fand diese Lösung in den Apple Entwicklerforen und es funktionierte wie ein Zauber.

Ich füge ihre Lösung hier in der Hoffnung, dass es für andere einfacher sein wird, in der Zukunft zu finden, die author Kredit und their post verknüpfen.

in Ihre AppDelegate Datei:

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") 

    } 

} 

In der Viewcontroller, die Ihnen eine Orientierung zwingen wollen:

override func viewDidAppear(_ animated: Bool) { 

    super.viewDidAppear(animated) 

    AppDelegate.AppUtility.lockOrientation(.portrait) 

} 

override func viewWillDisappear(_ animated: Bool) { 

    super.viewWillDisappear(animated) 

    AppDelegate.AppUtility.lockOrientation(.all) 

} 
+0

Danke für Ihre Antwort. Ich habe Ihre Lösung getestet, aber das Problem ist immer noch gleich. Die Lösung funktioniert auf dem iPhone aber es funktioniert nicht auf dem iPad.Wie ich bereits erwähnt habe in einem meiner Kommentar, dass es nur auf dem iPad funktioniert, wenn der "Vollbildmodus" aktiviert ist. Wenn Sie eine erweiterte Lösung für das iPad kennen, die damit arbeitet Aus dieser Flagge zum Ankreuzen dann lass es mich wissen. – neena

Verwandte Themen