需求
今天在使用B站的ijkmedia做視屏播放的功能孕惜,視頻播放的那個(gè)頁(yè)面我想強(qiáng)制讓他橫屏愧薛。當(dāng)前的應(yīng)用本來是一個(gè)豎屏應(yīng)用。查了各種網(wǎng)站方法很多種衫画,但是很多都有各種問題毫炉,不符合當(dāng)前的場(chǎng)景。最終找到了一個(gè)解決辦法削罩。
處理方法
1 UINavagationController
由于當(dāng)前的屏幕狀態(tài)是通過UINavagationController來控制的瞄勾,所以我們首先需要自定義一個(gè)UINavagationController:
@implementation XddBaseNavagationVC
- (BOOL)shouldAutorotate
{
return [self.viewControllers.lastObject shouldAutorotate];
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return [self.viewControllers.lastObject supportedInterfaceOrientations];
}
@end
這么做是為了當(dāng)從橫屏頁(yè)面返回之后,能夠讓頁(yè)面保持豎屏(其實(shí)是去獲取返回之后VC的屏幕狀態(tài))弥激。
2 UITabBarViewController
因?yàn)楫?dāng)前的應(yīng)用是一個(gè)tabbar應(yīng)用丰榴,所以我們也需要保證tabbar能夠正常的顯示。我使用了一個(gè)分類來處理這個(gè)問題秆撮,tabbarvc的狀態(tài)依賴當(dāng)前選中的VC的屬性:
@implementation LCTabBarController (Autorotate)
- (BOOL)shouldAutorotate
{
return [self.selectedViewController shouldAutorotate];
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return [self.selectedViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}
@end
3 BaseVC
然后在我的整個(gè)應(yīng)用中四濒,BaseVC是所有的VC的基類,通過這個(gè)我統(tǒng)一的處理了一些問題职辨,因?yàn)楫?dāng)前的應(yīng)用是豎屏的盗蟆,所以在BaseVC中實(shí)現(xiàn)如下幾個(gè)函數(shù),保證VC豎屏顯示:
// 只支持豎屏
- (BOOL)shouldAutorotate {
return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}
4 橫屏VC的處理
我的橫屏的VC也是繼承了BaseVC舒裤,如果不處理喳资,也會(huì)豎屏。通過以下代碼進(jìn)行特殊處理腾供,覆蓋BaseVC中的幾個(gè)方法:
- (BOOL)shouldAutorotate {
return YES;
}
- (UIInterfaceOrientationMask) supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscapeRight;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeRight;
}
這樣就能讓他正確的橫屏顯示仆邓,并且返回回去仍然是豎屏鲜滩。
注意點(diǎn)
當(dāng)在彈出橫屏的VC的時(shí)候一定要注意以下幾點(diǎn):
- 當(dāng)前的方式只支持模態(tài)彈出。push是會(huì)出問題的节值。
2.彈出方法,必須要用XddBaseNavagationVC進(jìn)行包裝才可以使用徙硅,否則會(huì)導(dǎo)致返回之后豎屏的頁(yè)面變成橫屏。
UINavigationController *nav = [[XddBaseNavagationVC alloc]initWithRootViewController:[[IJKVideoViewController alloc] initWithURL:url]];
[viewController presentViewController:nav animated:YES completion:completion];