2015-04-29 2 views
1

Могу ли я установить ориентацию на портрет и зафиксировать ориентацию только в одном контроллере?Как заблокировать ориентацию только для одного контроллера вида?

Я попробовать:

override func supportedInterfaceOrientations() -> Int { 
    return Int(UIInterfaceOrientationMask.Portrait.rawValue) 
} 

override func shouldAutorotate() -> Bool{ 
    return false 
} 

, но это не помогает мне. Должен ли я добавить что-нибудь еще?

ответ

6

Этот код должен работать:

override func supportedInterfaceOrientations() -> Int { 
     return Int(UIInterfaceOrientationMask.Portrait.rawValue) 
    } 

    override func shouldAutorotate() -> Bool{ 
     return false 
    } 

    override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation { 
     return UIInterfaceOrientation.Portrait 
    } 

Если теперь работает для вас, то я полагаю, ваш контроллер находится в какой-то другой контроллер (UINavigationController, UITabBarController, UISplitViewController). В этом случае вам необходимо использовать этот код в этом родительском контроллере.

Если навигационный контроллер содержит более одного контроллера вида, и вам необходимо отключить ориентацию только для некоторых из них, то вам нужно наследовать UINavigationController класс и написать там что-то вроде:

class NavigationController: UINavigationController { 

    var shouldRotate: Bool = true 

    override func supportedInterfaceOrientations() -> Int { 
     return shouldRotate ? Int(UIInterfaceOrientationMask.Portrait.rawValue) : Int(UIInterfaceOrientationMask.All.rawValue) 
    } 

    override func shouldAutorotate() -> Bool{ 
     return shouldRotate 
    } 
} 

Тогда в контроллере что вам нужно отключить ориентацию вы можете отключить его для навигации контроллера:

class ViewController: UIViewController { 

    var lastControllerRotationStatus: Bool? 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     if let navigationController = self.navigationController as? NavigationController { 
      lastControllerRotationStatus = navigationController.shouldRotate 
      navigationController.shouldRotate = false 
     } 
    } 

    override func viewDidDisappear(animated: Bool) { 
     super.viewDidDisappear(animated) 

     if let navigationController = self.navigationController as? NavigationController { 
      navigationController.shouldRotate = lastControllerRotationStatus ?? true 
     } 
    } 
} 

Но помните, что вам нужно восстановить старый статус вращения после того, как контроллер будет выталкиваться навигации CON Троллингист. В этом примере я сохраняю статус вращения до его изменения и восстанавливаю его после исчезновения контроллера. Также вы можете использовать другой подход. Например, вы можете перегрузить UINavigationController метод popViewController, и там установлено значение shouldRotate на false.

Тот же подход с переменной установкой от контроллера вы можете использовать для управления вращением от AppDelegate метода application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> Int

Тогда вам не нужно наследовать от навигационного контроллера.

Ваш AppDelegate класс код будет выглядеть следующим образом:

class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    var shouldRotate = true 
    func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int { 

     return shouldRotate ? Int(UIInterfaceOrientationMask.All.rawValue) : Int(UIInterfaceOrientationMask.Portrait.rawValue) 

    } 

} 

И ваш контроллер код будет выглядеть следующим образом:

class ViewController: UIViewController { 

    var lastControllerRotationStatus: Bool? 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate { 
      lastControllerRotationStatus = appDelegate.shouldRotate 
      appDelegate.shouldRotate = false 
     } 
    } 

    override func viewDidDisappear(animated: Bool) { 
     super.viewDidDisappear(animated) 

     if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate { 
      appDelegate.shouldRotate = lastControllerRotationStatus ?? true 
     } 
    } 
} 
+0

это не делает опять работа. Мой viewController находится в NavigationController, но у него (NavigationController) есть много других диспетчеров viewControllers, и мне это нужно только в одном контроллере. –

+0

@OrkhanAlizade Подождите 10 минут. Я напишу новый код –

+0

в порядке. Конечно. Я жду –

0

Просто поместите это в viewDidAppear:

let value = UIInterfaceOrientation.Portrait.rawValue 
UIDevice.currentDevice().setValue(value, forKey: "orientation") 
+0

ничего =/он снова вращается –

+0

Вы положили его в появилось? Я ошибся, что я отредактировал – Mika

+0

. Но это не работает –

1

Я нашел это по аналогичному вопросу. Link

«Прежде всего, я благодарю вас за зеллба, который дал мне этот ответ и заставил меня понять. Чтобы установить ориентацию устройства на один контроллер просмотра на портрет и другие на оба, вы можете установить это в AppDelegate. скоро с этой функцией, которая имела supportedInterfaceOrientationsForWindow

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> Int { 

return checkOrientation(self.window?.rootViewController?)// This is the custom function that u need to set your custom view to each orientation which u want to lock 

} 

А вот функция, которая проверяет для каждого контроллера представления для установки Портрета или все ориентации базы на то, что у хотят.

func checkOrientation(viewController:UIViewController?)-> Int{ 

if(viewController == nil){ 

    return Int(UIInterfaceOrientationMask.All.rawValue)//All means all orientation 

}else if (viewController is SignInViewController){ 

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)//This is sign in view controller that i only want to set this to portrait mode only 

}else{ 

    return checkOrientation(viewController!.presentedViewController?) 
} 
} 

и не забудьте установить контроллер представления которого и хочет заблокировать в Attribute Inspector, которые включают в себя ориентацию на «Портрет» и другими «Прогнозная»»

Надежды, что помогает.

4

Если вы хотите портретной ориентации, но вы хотите, чтобы заблокировать только одну ViewController (например, пейзаж), вы можете сделать это следующим образом:

Это работает для меня Swift 2.0

AppDelegate

var shouldRotate = true 

//MARK: - Func to rotate only one view controller 
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { 

    if (shouldRotate == true){ 
     return UIInterfaceOrientationMask.All 
    } 

    return UIInterfaceOrientationMask.Landscape 

} 

ViewController

override func viewDidLoad() { 
     super.viewDidLoad() 

     // 1. lock the rotation 
     let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     appdelegate.shouldRotate = false 

     // 2. Force the device in landscape mode when the view controller gets loaded 
     UIDevice.currentDevice().setValue(UIInterfaceOrientation.LandscapeRight.rawValue, forKey: "orientation") 
    } 

    override func shouldAutorotate() -> Bool { 
     // 3. Lock autorotate 
     return false 
    } 

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
     return [UIInterfaceOrientationMask.LandscapeRight, UIInterfaceOrientationMask.LandscapeLeft] 
    } 


    override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation { 

     // 4. Only allow Landscape 
     return UIInterfaceOrientation.LandscapeRight 
    } 

    // 5. Restoring the locked-rotation before controller disappeared 
    override func viewWillDisappear(animated: Bool) { 
     let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     appdelegate.shouldRotate = true 
    } 
0

Swift 3 Ответ:

В контроллере представления вы хотите, чтобы заблокировать ориентацию

override var shouldAutorotate: Bool { 
    return false 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    return .portrait 
} 

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { 
    return .portrait 
} 

адаптировано из how to lock portrait orientation for only main view using swift

0

** Добавить в файл AppDelegate: *

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

Добавить в ViewController, что вы хотите, чтобы заставить ориентацию:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    AppDelegate.AppUtility.lockOrientation(.portrait) 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    AppDelegate.AppUtility.lockOrientation(.all) 
    } 
Смежные вопросы