假設(shè)有兩視圖頁(yè)面A和B,A豎屏顯示,B要求橫屏顯示,C豎屏顯示,NavigationController的root view是A,在storyboard中綁定好類名和ID,結(jié)構(gòu)大概這樣:
在AppDelegate中編寫代碼讓APP能支持所有屏目方向(或者在General->Deployment Info->Device Orientation中勾選所有方向也可以):
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
return .All
}
同時(shí)設(shè)置,不然在ipad上,頁(yè)面方向會(huì)隨屏目轉(zhuǎn)動(dòng)
在NavigationController中重寫(假設(shè)window.rootViewController是NavigationController的情況;如果頂層是TabBarController則在TabBarController重寫下面的代碼;如果是ViewController則在ViewController中重寫下面的代碼),讓頁(yè)面默認(rèn)是豎直方向:
import UIKit
class NavigationController: UINavigationController {
//這里需要設(shè)置為false,否則在橫屏下將出現(xiàn)豎屏的鍵盤
override func shouldAutorotate() -> Bool {
return false
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .Portrait
}
}
override var preferredInterfaceOrientationForPresentation : UIInterfaceOrientation {
return .portrait
}
接下來(lái)在B中編寫它支持的方向:
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .Landscape
}
//此方法設(shè)置viewController的初始顯示方向. 此方法也僅有在當(dāng)前viewController是rootViewController或者是modal模式時(shí)才生效.
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return .LandscapeLeft
}
下面在A的按扭中增加代碼顯示視圖B的代碼,當(dāng)然顯示的方式是modal的方式,可以簡(jiǎn)單測(cè)試一下:
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let b = storyboard.instantiateViewControllerWithIdentifier("BViewController")
self.presentViewController(b, animated: false, completion: nil)
到上面這一步橫屏顯示是沒問(wèn)題了,但是會(huì)發(fā)現(xiàn)C的顯示也會(huì)是modal模式,如果希望C顯示時(shí)具有NavigationBar,不影響其它頁(yè)面對(duì)B的調(diào)用,應(yīng)當(dāng)如何實(shí)現(xiàn)?這是接下來(lái)要講的一個(gè)技巧,使得橫屏?xí)r能被正常push進(jìn)NavigationController的vc列表中,而且c也顯示在navigationController的vc列表中,有NavigationBar.
我們只需要給B視圖增加一個(gè)輔助頁(yè)面D來(lái)進(jìn)行對(duì)B的管理.這樣A->D->C,這樣調(diào)用顯示肯定是最正常的NavigationController VC列表.我們只需要在顯示D的同時(shí)顯示B,D消失時(shí)B消失,就能達(dá)我們的要求了.
D的實(shí)現(xiàn):
import UIKit
class DViewController: UIViewController {
var b:BViewController!
override func viewDidLoad() {
self.view.backgroundColor = UIColor.whiteColor()
if b == nil {
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
self.b = storyboard.instantiateViewControllerWithIdentifier("BViewController") as! BViewController
}
}
override func viewWillAppear(animated: Bool) {
if b.view.window == nil {
self.navigationController?.presentViewController(b, animated: false, completion: nil)
}
}
}
B的實(shí)現(xiàn):
import UIKit
class BViewcontroller: UIViewController {
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .Landscape
}
//剛進(jìn)入頁(yè)面時(shí)的方向
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return .LandscapeLeft
}
@IBAction func onBack(sender: AnyObject) {
let nv = self.presentingViewController as? UINavigationController
nv?.popViewControllerAnimated(false)
self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func onTouchUp(sender: UIButton) {
let nv = self.presentingViewController
let sb = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let c = sb.instantiateViewControllerWithIdentifier("CViewController")
self.dismissViewControllerAnimated(false, completion: nil)
nv?.showViewController(c, sender: nil)
}
}
簡(jiǎn)單的理解為B和D綁定在一起,同時(shí)顯示,同時(shí)隱藏
源碼:https://github.com/ghyh22/PageRotateExample
參考資料:
http://www.cnblogs.com/jhzhu/p/3480885.html