2016-11-04 19 views
11

çalışmıyor shouldAutorotate ve bunu başarmak mümkün değil.ağır basan Bir <code>UIViewController</code> üzerinde dönmesini önlemeye çalışıyorum Swift 3

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

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

Ve UIViewControler stills dönen:

Böyle bir şey yapıyorum. UIViewController bir UINavigationController'ın içinde açıldı.

buradan birçok soru baktım ve hiçbiri benim için çalışmalarını cevaplar.

Swift 2 ben shouldAutorotate geçersiz kılmak için kullanılan ancak Swift 3'te bu fonksiyon artık yok.

nasıl Swift 3'te Ben Swift 2'de yapardı ne yapabilir? Bilmiyorum

+1

Ne 'supportedInterfaceOrientations' neye benziyor? – matt

+0

@matt – pableiros

+0

Teşekkürler ekleyerek soruyu düzenledim. Tamam, eğer bu sunulan bir kontrolörse, sadece portrede görünmeli ve orada kalmalı. Bu olmuyorsa, hikaye için daha fazla olmalı. Bu görüntüleme denetleyicisini _how_ tarif edebilir misiniz? Üst düzey bir üst düzey görüntü denetleyicisi olduğunu bana kanıtlayın. Eğer bir görünüm denetleyicisi sunmak Eğer kalıcı bir görünüm denetleyicisi – matt

cevap

22

neden bu davranışı kez sürü üretebileceği eğer soruyu kapatmak için bir oy olduğunu. UIViewController, moda olarak açılan bir UINavigationController'un içinde.

Sorunu çözmek için yaptığım şey budur. Beni

+0

çalışır ancak yalnızca belirli bir UIViewController istediğini eğer tüm gezinme yığını döndürmek değil mi? Bu sorunun amacı bir navigasyon denetleyici içinde bir görünüm denetleyicisi dönmesini önlemek için nasıl geçti tamam http://stackoverflow.com/a/39805665 –

+0

@RoyShilkrot, nasıl önlemek için değil: Bu cevap daha iyi bir gibi görünüyor Tüm bir navigasyon yığınının içinde belirli bir kontrolör kontrolörü – pableiros

3

AppDelegate Bu kodu için çalıştığını,

Bu sınıf oluşturmak ve ben önlemek istiyorsanız UIViewController bunu

class NavigationController: UINavigationController { 

    override var shouldAutorotate: Bool { 
     return false 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return .portrait 
    } 

} 

döndürmek Ve thats containt o UINavigationController ayarlı. hızlı

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

bir yönünü zorlamak isteyen viewcontroller ekle:

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


    AppDelegate.AppUtility.lockOrientation(.landscapeLeft) 

} 
+0

Bu benim için çalışır, ancak kabul edilen cevap daha temiz ve çalışır.Kabul edilen cevabın mümkün olmadığı ve sadece bunun işe yaradığı belirli bir senaryo var mı? – paul