переключение на другой контроллер представления при вращении устройства

#swift #view #controller #switch-statement

#swift #Вид #контроллер #switch-инструкция

Вопрос:

Можно ли переключиться на другой контроллер представления, только повернув устройство влево / вправо?

Я бы попробовал это с помощью: // LandscapeTabView

 override func viewWillLayoutSubviews() {

    if UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft || UIDevice.current.orientation == UIDeviceOrientation.landscapeRight {  

    } 
    else {

    }
  

Но не знаете, что заполнить в этой функции?
Спасибо за помощь новичку!

Ответ №1:

Во-первых: вы можете подписаться на системное уведомление о вращении устройства следующим образом

 NotificationCenter.default.addObserver(self, selector: #selector(self.orientationChanged), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
  

Затем создайте функцию

 func orientationChanged() {}
  

Для правильного определения состояния я рекомендую использовать этот метод

 UIApplication.shared.statusBarOrientation == .portrait
  

Если его true — портрет, false — пейзаж

Таким образом, в зависимости от состояния, например, вы можете поместить некоторый vc в альбомную ориентацию и вставить его, когда устройство будет возвращено. Для нажатия вы можете легко создать экземпляр вашего ViewController таким образом

 let vc = self.storyboard?.instantiateViewControllerWithIdentifier("here_is_vc_id") as! YourViewController
  

И для pop:

 _ = navigationController.pushViewController(vc, animated: true)
  

Примечание: VC, который вы создаете, должен храниться на одной (и основной) раскадровке. Также вам необходимо настроить is (куда идет строка «here_is_vc_id») в инспекторе идентификации в поле «Идентификатор раскадровки».

Вот так 🙂

Ответ №2:

Попробуйте мои небольшие усилия-

 func rotated()
    {
        if(UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation))
        {
            print("landscapeMode")
            let nextView = self.storyboard?.instantiateViewControllerWithIdentifier("HomeWorkViewController") as! HomeWorkViewController
        self.navigationController?.pushViewController(nextView, animated: true)

        }

        if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation))
        {
            print("PortraitMode")
            //As you like
        }

    }
  

Ответ №3:

Предложенные подходы действительны, но рекомендуемый способ реагирования на такого рода изменения — использовать UIContentContainer протокол (iOS8 ).

Затем вы можете добавить дочерний контроллер представления к своему контроллеру и управлять тем, как он должен анимироваться. Вы можете использовать это в качестве ссылки: реализация контроллера представления контейнера.

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    let isPortrait = size == UIScreen.mainScreen().fixedCoordinateSpace.bounds.size

    // Add a child view controller if landscape, remove it if portrait...
}