屏幕旋轉(zhuǎn)是個(gè)坑
最近做的項(xiàng)目中有不少地方遇到了需要旋轉(zhuǎn)屏幕的地方,在屏幕旋轉(zhuǎn)的大坑里掙扎了一番,發(fā)現(xiàn)網(wǎng)上很多關(guān)于屏幕旋轉(zhuǎn)的文章講的大同小異,而且很多方法都已經(jīng)失效,所以特此寫下這篇爬坑紀(jì)錄。
常規(guī)的屏幕旋轉(zhuǎn)
最常規(guī)的屏幕旋轉(zhuǎn)方法應(yīng)該是在控制器中實(shí)現(xiàn)如下3個(gè)方法
// 是否支持自動(dòng)旋轉(zhuǎn)屏幕
- (BOOL)shouldAutorotate {
return NO;
}
// 旋轉(zhuǎn)支持的屏幕方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
// 默認(rèn)屏幕方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationPortrait;
}
一般,只要設(shè)置好這三個(gè)方法就可以達(dá)到屏幕旋轉(zhuǎn)的效果。
但是!當(dāng)你真正來實(shí)現(xiàn)這個(gè)方法的時(shí)候,你會(huì)發(fā)現(xiàn),很多時(shí)候屏幕并不能旋轉(zhuǎn)!
這是為什么呢?下面來講講原因。
屏幕旋轉(zhuǎn)中的坑
在屏幕旋轉(zhuǎn)中,其實(shí)有不少坑。如果對(duì)屏幕旋轉(zhuǎn)的了解不深的話,可能就會(huì)掉進(jìn)去。
如果想要屏幕旋轉(zhuǎn),必須在根控制器中實(shí)現(xiàn)。如果根控制器是TabbarController,上面的三個(gè)方法就要在TabbarController中實(shí)現(xiàn),如果根控制器是NavigationController,就要在NavigationController中實(shí)現(xiàn)。如果不想修改根控制器,而想讓新控制器支持屏幕旋轉(zhuǎn),那么就只能通過modal的方式彈出新控制器,然后在新控制器中實(shí)現(xiàn)上面的三個(gè)方法。
就算你按照我上面說的方法來做,可能你會(huì)發(fā)現(xiàn),屏幕還是沒有旋轉(zhuǎn)。這是為什么呢?這是因?yàn)?,你在Target -> General -> Device Orientation中不支持你要旋轉(zhuǎn)的屏幕方向。如果你打開所有你應(yīng)用中需要的屏幕方向,你就會(huì)發(fā)現(xiàn),上面的方法又都可以用了。是不是很開心?

非常規(guī)的屏幕旋轉(zhuǎn)
對(duì)大部分情況來說,上面的代碼已經(jīng)夠用了。但是,這樣的代碼在iPhonePlus上有時(shí)候會(huì)出現(xiàn)一些BUG。
在什么情況下呢?在,當(dāng)你的應(yīng)用只支持豎屏,而在應(yīng)用中的某些特定頁面(例如視頻播放頁)卻支持橫豎屏方向時(shí),會(huì)出現(xiàn)一個(gè)Bug。這個(gè)Bug只有在Plus上才會(huì)出現(xiàn)。因?yàn)橹挥蠵lus才會(huì)出現(xiàn)這種情況。

這種情況下如果按照上面的方法進(jìn)入應(yīng)用,進(jìn)入應(yīng)用時(shí)屏幕方向就會(huì)變成默認(rèn)橫屏,而且由于你設(shè)置了不支持自動(dòng)旋轉(zhuǎn),應(yīng)用就會(huì)一直橫屏。這下就壞啦。。。
那么這種情況該怎么辦呢?
答案是在Target -> General -> Device Orientation只支持豎屏。然后在AppDelegate中實(shí)現(xiàn)如下代碼:
// 設(shè)置設(shè)備支持的旋轉(zhuǎn)方向
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
這樣,Bug就解決啦。