目前視頻播放應(yīng)用越來(lái)越常見(jiàn),視頻播放器的開(kāi)發(fā)是個(gè)難點(diǎn),同時(shí)app中播放器的橫豎屏轉(zhuǎn)換也是一個(gè)難點(diǎn),而我也有幸接觸這塊內(nèi)容,就橫豎屏轉(zhuǎn)換走過(guò)一些彎路,僅此記錄做個(gè)分享。
播放器橫屏難點(diǎn)在于app適配iPhone手機(jī),大多是只支持豎屏,如何保證視頻橫屏并不影響其它模塊,我嘗試過(guò)三種方法。
- 改變player的view的形變屬性
這種方式是最簡(jiǎn)單的實(shí)現(xiàn)視頻橫屏播放的方式,當(dāng)用戶(hù)觸發(fā)橫屏事件的時(shí)候,將player的view添加到keyWindow上,重新計(jì)算frame,以UIView動(dòng)畫(huà)的形式執(zhí)行,就可以實(shí)現(xiàn)橫屏的轉(zhuǎn)屏動(dòng)畫(huà),視頻就可以全屏播放了。
不足:這是一種假轉(zhuǎn)屏的方法,系統(tǒng)通知,狀態(tài)欄,音量圖標(biāo)等都還是豎屏的。會(huì)一定程度上會(huì)影響體驗(yàn)。
- 以非動(dòng)畫(huà)方式present一個(gè)只支持橫屏幕的controller,controller上添加present前的一張屏幕截圖,實(shí)現(xiàn)豎屏控制器和橫屏控制器無(wú)縫切換
- 這種方式實(shí)現(xiàn)了真轉(zhuǎn)屏,彌補(bǔ)了第一種方式的不足,但是實(shí)現(xiàn)上相對(duì)復(fù)雜。
首先,Appdelegate中添加以下代碼
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if ([self.window.rootViewController.presentedViewController isKindOfClass:[WKModelViewController class]])
{
WKModelViewController *vc = self.window.rootViewController.presentedViewController;
if (vc && vc.isPresented) {
return UIInterfaceOrientationMaskAllButUpsideDown;
}else{
return UIInterfaceOrientationMaskPortrait;
}
}
else return UIInterfaceOrientationMaskPortrait;
}
appdelegate中的這個(gè)方法控制著app轉(zhuǎn)屏的功能,要想轉(zhuǎn)屏需要返回正確的屏幕方向;
然后WKModelViewController這個(gè)類(lèi)初始化時(shí)添加一個(gè)UIImageView,放present它之前頁(yè)面的截圖,并強(qiáng)制轉(zhuǎn)屏.
NSNumber*newOrientation = [NSNumber numberWithInteger:UIInterfaceOrientationLandscapeLeft];
[[UIDevice currentDevice] setValue:newOrientation forKey:@"orientation"];
最后以非動(dòng)畫(huà)方式present這個(gè)控制器就可以看到狀態(tài)欄橫屏了,而之前頁(yè)面沒(méi)有變化的效果;
過(guò)程中遇到的問(wèn)題,狀態(tài)欄橫屏后不顯示,在viewWillAppear中執(zhí)行
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
- 不足:在present這個(gè)控制器的時(shí)候,偶現(xiàn)控制器ImageView輕微抖動(dòng)
這點(diǎn)貌似是強(qiáng)制轉(zhuǎn)屏后,控制器中UIImageView的frame變化導(dǎo)致了,嘗試在多個(gè)地方改變frame還是會(huì)出現(xiàn),我還沒(méi)有找到方法,也是會(huì)影響體驗(yàn)的。
- 直接調(diào)用轉(zhuǎn)動(dòng)statusbar的方法
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO];
設(shè)置狀態(tài)欄橫屏,這個(gè)方法雖說(shuō)已經(jīng)DEPRECATED了,但是它能很好的滿(mǎn)足視頻轉(zhuǎn)屏的需求,而且轉(zhuǎn)動(dòng)過(guò)程并不改變之前視圖的屏幕方向,但會(huì)改變系統(tǒng)通知,音量圖片等屏幕方向,實(shí)現(xiàn)起來(lái)也是相對(duì)簡(jiǎn)單。
首先在keywindow的rootController中添加一個(gè)方法,
- (BOOL)shouldAutorotate{
return NO;
}
之后就可以愉快地調(diào)用狀態(tài)欄旋轉(zhuǎn)的方法了。
- 不足:此方法蘋(píng)果不推薦使用了,存在iOS更新后的風(fēng)險(xiǎn)
以上就是我在視頻播放器轉(zhuǎn)屏這塊的嘗試,比較起來(lái)第三種方法是最簡(jiǎn)單,最有效的方式。