【发布时间】:2015-10-30 21:30:56
【问题描述】:
在过去的几天里,我一直在想办法做到这一点:
如果处于横向模式,请更改为 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)
}
}
Main viewController(portraitViewController) 包含一个 tableview 和一个 searchController,顶部有一个 searchBar。
在故事板中,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)
}
}
【问题讨论】:
标签: ios iphone swift uiviewcontroller screen-orientation