今天做項(xiàng)目纽什,某一個(gè)VC需要展現(xiàn)VR展覽內(nèi)容措嵌,產(chǎn)品要求這個(gè)VC可以橫屏查看,因?yàn)闄M屏查看的時(shí)候芦缰,看的范圍比較大企巢,但是其余的VC都是豎屏顯示的,為了達(dá)到某個(gè)VC橫屏顯示其余VC不變的效果让蕾,然后查詢資料浪规,擼代碼。探孝。
查詢過資料之后笋婿,大概分為四種實(shí)現(xiàn)方式,我使用的是第四種實(shí)現(xiàn)方法顿颅。
第一種:重寫方法:shouldAutorotate 和supportedInterfaceOrientations
- 寫一個(gè)子類CusNavigationController 繼承 UINavigationController缸濒,在CusNavigationController中重寫方法:shouldAutorotate 和 supportedInterfaceOrientations
override var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
- 在AppDelegate中設(shè)置RootViewController為CusNavigationController容器的VC
- 然后再A里邊重寫shouldAutorotate 和 supportedInterfaceOrientations方法
override var shouldAutorotate: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return [.landscapeLeft,.landscapeRight]
}
這樣的話,就可以支持在A頁面的時(shí)候旋轉(zhuǎn)VC了。
第二種:強(qiáng)制轉(zhuǎn)換
- 注意:Apple在3.0以后都不支持這個(gè)辦法了庇配,這個(gè)辦法已經(jīng)成為了私有的了斩跌,但是要跳過App Stroe的審核,需要一點(diǎn)巧妙的辦法捞慌。
//swift3的時(shí)候orientation這個(gè)參數(shù)可能報(bào)錯(cuò)耀鸦,直接用0,1啸澡,2袖订,3代替方向即可
NSNumber *orientationTarget = [NSNumber numberWithInt:orientation];
[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
第三種:通過人為的辦法改變view.transform的屬性。
- 這個(gè)很繁瑣嗅虏,一般不推薦使用洛姑,因?yàn)槔镞叺牟季中枰约阂粋€(gè)view一個(gè)view的重新布局,如果又想用的旋恼,可以參考:
http://www.cnblogs.com/mrhgw/archive/2012/07/18/2597218.html(http://www.cnblogs.com/mrhgw/archive/2012/07/18/2597218.html)
第四種:通過appDelgate和第二種方法結(jié)合的方式實(shí)現(xiàn)
- 在appdelegate中設(shè)置代碼如下:
/// 設(shè)置橫屏/豎屏顯示
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if changeOrientation {
return [.landscapeLeft,.portrait,.landscapeRight]
}else {
return .portrait
}
}
- 然后再需要實(shí)現(xiàn)選擇的VC中設(shè)置代碼如下:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//打開試圖的橫屏顯示
AppDelegate.shareInstance().changeOrientation = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//將試圖還原為豎屏
AppDelegate.shareInstance().changeOrientation = false
UIDevice.current.setValue(NSNumber(value: 1), forKey: "orientation")
}
- 再通過實(shí)現(xiàn)系統(tǒng)的方法吏口,改變view里邊的布局
override func willAnimateRotation(to toInterfaceOrientation:UIInterfaceOrientation, duration: TimeInterval) {
if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
self.standScreen()
}
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
self.acrossScreen()
}
}
func standScreen() {
contentView?.frame = CGRect(x: 0, y: NavigationBarHeight, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)
self.customNavBar?.width = SCREEN_WIDTH
}
func acrossScreen() {
contentView?.frame = CGRect(x: 0, y: NavigationBarHeight, width: SCREEN_HEIGHT, height: SCREEN_WIDTH)
self.customNavBar?.width = SCREEN_HEIGHT
}
- 我這里只有一個(gè)webview(contentView)和一個(gè)導(dǎo)航欄(self.customNavBar)改變一下frame就可以了