簡體   English   中英

如何基於設備方向更改viewController

[英]How to change viewController based on device orientation

在過去的幾天里,我一直在努力尋找一種方法來做到這一點:

如果在橫向模式下,請更改為CollectionViewController。 如果處於縱向模式,請更改為ViewController。

音樂應用程序的行為方式幾乎相同。

我這樣做的方法是在我的主要portraitViewController類中實現viewWillTransitionToSize():

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

    let storyBoard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
    let portraitViewController = storyBoard.instantiateViewControllerWithIdentifier("portraitViewController") as! ViewController
    let landscapeViewController = storyBoard.instantiateViewControllerWithIdentifier("landscapeViewController") as! beerCollectionViewController

    if (UIDevice.currentDevice().orientation.isLandscape) {
        // In landscape

        presentViewController(landscapeViewController, animated: true, completion: nil)

    } else {
        // In portrait

        self.navigationController?.presentViewController(portraitViewController, animated: true, completion: nil)
       //let navVC = UINavigationController(rootViewController: portraitViewController)
       //presentViewController(navVC, animated: true, completion: nil)

        //Dismiss collectionViewController after switching back to portrait
        self.dismissViewControllerAnimated(true, completion: nil)
    }

}

主viewController(portraitViewController)包含一個表視圖和一個頂部具有searchBar的searchController。

在情節提要中,portraitViewController嵌入在導航控制器中,collectionViewController(landscapeViewController)單獨存在。

它運行,但是我收到以下2條警告:

嘗試在視圖不在窗口層次結構中的ViewController上呈現UINavigationController!

不允許在取消分配時嘗試加載視圖控制器的視圖,這可能會導致未定義的行為(UISearchController)

有人可以指出這里出了什么問題嗎? 如果有任何教程/示例可以提供幫助,我將不勝感激! 非常感謝你的幫助

編輯 :這是有效的最終代碼

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

    let storyBoard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())

    // In landscape
    if UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation) {
        let landscapeVC = storyBoard.instantiateViewControllerWithIdentifier("landscapeViewController") as! beerCollectionViewController
        if presentedViewController != nil {
            if !presentedViewController!.isBeingDismissed() {
                self.dismissViewControllerAnimated(false, completion:  {
                    self.presentViewController(landscapeVC, animated: true, completion: nil)
                })
            }
        } else {
            self.presentViewController(landscapeVC, animated: true, completion: nil)
        }

    }
    // In portrait
    else {
        let navC = storyBoard.instantiateViewControllerWithIdentifier("navID") as! UINavigationController
        let portraitVC = storyBoard.instantiateViewControllerWithIdentifier("portraitViewController") as! ViewController

        if presentedViewController != nil {
            if !presentedViewController!.isBeingDismissed() {
                self.dismissViewControllerAnimated(false, completion:  {
                    navC.pushViewController(portraitVC, animated: true)
                })
            }
        } else {
            navC.pushViewController(portraitVC, animated: true)
        }
    }

這些警告或錯誤的原因是,在關閉和呈現視圖控制器時存在延遲,並且您呈現和關閉的調用彼此重疊。

第一個錯誤報告該視圖不在層次結構中,這意味着您試圖在原來的視圖控制器或導航控制器上顯示一個視圖,該視圖不再可用,因為已模態地顯示了另一個視圖控制器。

與在取消分配視圖時加載視圖有關的第二個錯誤指​​示,當嘗試進行另一個模式表示時,視圖控制器的解除還沒有完全完成。

為防止這些問題,需要在提交新的視圖控制器之前確保撤消已完成。 這可以通過在dismiss方法中使用完成處理程序處理狀態並在isBeingDismissed狀態上添加檢查來實現。

這是一些實現此目的的代碼:

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

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    if UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation) {
        let landscapeVC = storyboard.instantiateViewControllerWithIdentifier("landscapeViewController") as! beerCollectionViewController

        if presentedViewController != nil {
            if !presentedViewController!.isBeingDismissed() {
                dismissViewControllerAnimated(false, completion:  {
                    self.presentViewController(landscapeVC!, animated: true, completion: nil)
                })
            }
        } else {
            self.presentViewController(landscapeVC!, animated: true, completion: nil)
        }
    } else { // Portrait
        let portraitVC = storyboard.instantiateViewControllerWithIdentifier("portraitViewController") as! ViewController

        if presentedViewController != nil {
            if !presentedViewController!.isBeingDismissed() {
                dismissViewControllerAnimated(false, completion:  {
                    self.presentViewController(portraitVC!, animated: true, completion: nil)
                })
            }
        } else {
            self.presentViewController(portraitVC!, animated: true, completion: nil)
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM