一般我們的項(xiàng)目都是只支持豎屏的湾戳,但最近做的項(xiàng)目是直播的火俄,因此我播放的時(shí)候我需要旋轉(zhuǎn)屏幕切換橫豎屏,所以在項(xiàng)目設(shè)置中需要打開(kāi)橫屏
Paste_Image.png
那么問(wèn)題來(lái)了诸狭,項(xiàng)目中有很多個(gè)控制器券膀,但我只要這個(gè)播放控制器可以橫豎屏,其他控制器不需要驯遇,此時(shí)有兩個(gè)解決辦法:
繼承實(shí)現(xiàn):如果項(xiàng)目是新項(xiàng)目芹彬,可以新建一個(gè)基類controller,重寫(xiě)shouldAutorotate方法叉庐,并返回NO舒帮,項(xiàng)目中的所有控制器都直接或者間接繼承它,需要橫豎屏的控制器重寫(xiě)它陡叠,并返回YES就可以了
分類實(shí)現(xiàn):如果項(xiàng)目已經(jīng)持續(xù)一段時(shí)間玩郊,而且控制器累積很多了,此時(shí)用繼承的方法就不太實(shí)際了枉阵,因此可以使用分類译红,新建一個(gè)UIViewController 的分類,重寫(xiě)shouldAutorotate方法兴溜,并返回NO侦厚,然后只需要在需要橫豎屏的控制器中重寫(xiě)它并返回YES就行,相對(duì)繼承實(shí)現(xiàn)拙徽,分類方便很多刨沦,因?yàn)槠涮匦裕灰先腠?xiàng)目膘怕,就算不導(dǎo)入頭文件想诅,都會(huì)先執(zhí)行分類的方法
然后在支持橫屏的控制器實(shí)現(xiàn)UIDeviceOrientationDidChangeNotification監(jiān)聽(tīng),參考我之前寫(xiě)的一篇簡(jiǎn)書(shū)指定控制器橫屏岛心,強(qiáng)制旋轉(zhuǎn)屏幕就兩句關(guān)鍵代碼
此時(shí)應(yīng)該有小伙伴說(shuō)shouldAutorotate方法不調(diào)用来破,通過(guò)實(shí)測(cè),下面我簡(jiǎn)單總結(jié)一下出現(xiàn)的情況:stackoverflow上有解釋
// 跟控制器是導(dǎo)航控制器鹉梨,那么在這個(gè)導(dǎo)航控制器中實(shí)現(xiàn)下面三個(gè)方法
-(BOOL)shouldAutorotate {
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations {
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
// 跟控制器是tabBar控制器讳癌,那么在這個(gè)tabBar控制器中實(shí)現(xiàn)下面三個(gè)方法
-(BOOL)shouldAutorotate {
return [self.selectedViewController shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations {
return [self.selectedViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}
- 如果不在跟控制器(UITabBarController 和 UINavigationController 都需要設(shè)置上面方法)中設(shè)置,那么不管你在Deployment Info勾選沒(méi)勾選橫屏,viewController中重寫(xiě)shouldAutorotate都不會(huì)調(diào)用的存皂。
- 如果在跟控制器中設(shè)置了上面方法,那么第一個(gè)控制器的shouldAutorotate能調(diào)用逢艘,但是往下push的控制器中的shouldAutorotate就不調(diào)用了旦袋,不管勾選沒(méi)勾選橫屏。
- 不管勾選沒(méi)勾選橫屏它改,如果modal一個(gè)沒(méi)有實(shí)現(xiàn)上面三個(gè)方法的UINavigationController控制器疤孕,那么新控制器的shouldAutorotate也是不能調(diào)用,如果model一個(gè)普通的viewController控制器中的shouldAutorotate都能調(diào)用央拖,還有如果modal一個(gè)自定義轉(zhuǎn)場(chǎng)的控制器祭阀,也是不能調(diào)用的鹉戚,例如使用我以前寫(xiě)的一個(gè)模仿push&pop的modal 就不行了。专控。抹凳。