iOS開發(fā):視頻全屏播放模式的切換

image.png

向曾經的前輩致敬!
本人iOS開發(fā)界菜鳥一枚,技術有限,寫得不好還請大神指教,謝謝!

方式1:工程設置里勾選橫屏方向的旋轉

WX20170711-141209@2x.png

核心方法:

//是否支持旋轉
- (BOOL)shouldAutorotate { }
//支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { }

//presentation方式展示支持的方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { }

PS:以上方法只有控制器為Window的root控制器的時候才有效果


主流結構的解決方案:

現(xiàn)在主流的項目結構都是:UITabBarController+UINavigationController+UIViewController,這種結構Window的root控制器就是UITabBarController,這個時候我們就需要去獲取當前展示的控制器的這三個方法的返回值了,做法就是自定義3個控制器,分別繼承自UITabBarController,UINavigationController,UIViewController

在自定義繼承UITabBarController的.m文件里重寫

- (BOOL)shouldAutorotate { return [self.selectedViewController shouldAutorotate]; }
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { return [self.selectedViewController supportedInterfaceOrientations]; }
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [self.selectedViewController preferredInterfaceOrientationForPresentation]; }

在自定義繼承UINavigationController的.m文件里重寫

- (BOOL)shouldAutorotate { return [self.topViewController shouldAutorotate]; }
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; }
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [self.topViewController preferredInterfaceOrientationForPresentation]; }

在自定義繼承UIViewController的.m文件里重寫

- (BOOL)shouldAutorotate { return NO; }
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; }

PS:讓項目中不支持旋轉的頁面全部繼承你自定義的UIViewController就可以了

優(yōu)勢:

設備在沒有鎖定旋轉的情況下,你的APP會根據(jù)設備的旋轉自動重新布局UI,一般在開發(fā)iPad程序中比較常見

劣勢:

  • 1.大部分手機APP(游戲除外)一般都是只支持豎屏,只有個別頁面支持旋轉(大多為視頻類APP),所以每個頁面你都需要去手動控制是否支持旋轉
  • 2.作為視頻類APP切換到全屏播放時候跟半屏的時候肯定UI控件的展示個數(shù)或者布局一般都會變化,這個時候你就需要封裝的播放器能準確的跟控制器同步,不然就會出現(xiàn)UI展示異常等情況
  • 3.播放器需要跟控制器進行交互才能做到例如鎖定旋轉,設備鎖定旋轉情況下手動全屏等功能

方式2:通過UIView的transform實現(xiàn)全屏播放

核心方法:
  • 1.監(jiān)聽設備的旋轉通知和獲取設備當前的朝向

// 監(jiān)聽設備旋轉通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];

//必須調用此方法后元暴,下面的方法才有效,不然獲取到的結果一直為0 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
//獲取設備的朝向 [[UIDevice currentDevice] orientation]

  • 2.根據(jù)獲取到的設備朝向來計算旋轉角度和狀態(tài)欄方向

//設置狀態(tài)欄方向(先將上面獲取到的設備朝向轉換為對應的狀態(tài)欄方向)
[[UIApplication sharedApplication] setStatusBarOrientation:orientation animated:NO];

//根據(jù)狀態(tài)欄方向獲取旋轉角度

  • (CGAffineTransform)getTransformWithOrientation:(UIInterfaceOrientation)orientation
    {
    if (orientation == UIInterfaceOrientationPortrait) {
    return CGAffineTransformIdentity;
    } else if (orientation == UIInterfaceOrientationLandscapeLeft){
    return CGAffineTransformMakeRotation(-M_PI_2);
    } else if (orientation == UIInterfaceOrientationLandscapeRight){
    return CGAffineTransformMakeRotation(M_PI_2);
    } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
    return CGAffineTransformMakeRotation(M_PI);
    }
    return CGAffineTransformIdentity;
    }
***
#####關于狀態(tài)欄隱藏后再顯示UINavigationBar會出現(xiàn)上移的解決方案
當播放器切換全屏的時候通常會隱藏狀態(tài)欄,如果此時播放器所處的控制器的UINavigationBar也是展示狀態(tài),就會出現(xiàn)切換回半屏的時候UINavigationBar上移跟狀態(tài)欄重疊的情況,如圖:

![image.png](http://upload-images.jianshu.io/upload_images/2186218-fe4f6a40fae267fe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

>**普通青年的隱藏方式**

[[UIApplication sharedApplication] setStatusBarHidden:YES];

**文藝青年的隱藏方式**

//獲取到狀態(tài)欄
UIView *statusBar = [[UIApplication sharedApplication]valueForKey:@"statusBar"]
//設置透明度為0
statusBar.alpha = 0.0f;


***
###優(yōu)勢:
- 1.整個項目都不再支持屏幕旋轉了,媽媽再也不用擔心因為旋轉造成的UI布局困擾了
- 2.封裝播放器在也不需要跟控制器做交互,哥哥想什么時候轉就什么時候轉
- 3.半屏切全屏的旋轉動畫也好看多了,請參照(** *騰訊視頻* **)

###劣勢:
- 1.需要自己控制狀態(tài)欄的方向,當然如果你們的項目不介意全屏播放時微信通知顯示在左側或者右側,你也可以無視,例如(** *網易云音樂 * **)
***
##總結:
最開始在著手做視頻類項目之前,本人在網上也找了很多視頻類的demo,不過demo始終是demo,基本都是以實現(xiàn)功能為目的,很多細節(jié)和實際需求完全沒有考慮到的,最終的結果就是只能一邊借鑒一邊摸索,上面的2種方法就是通過借鑒和摸索慢慢整理出來的,希望能給初次著手此類需求的同學作為參考.目前手頭上的項目已經迭代了好幾個版本了,播放器也重寫了不下5次了,項目早期使用的是方式1,后來隨著功能越來越多(當然有些需求比較奇葩),暴露出來的問題也越來越多,最后換成了現(xiàn)在的方式2,到目前為止,我個人認為方式2的效果要優(yōu)于方式一,當然此結論僅供參考!




最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末立膛,一起剝皮案震驚了整個濱河市犁罩,隨后出現(xiàn)的幾起案子磷杏,更是在濱河造成了極大的恐慌愈腾,老刑警劉巖笆怠,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔬浙,死亡現(xiàn)場離奇詭異猪落,居然都是意外死亡,警方通過查閱死者的電腦和手機畴博,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門笨忌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俱病,你說我怎么就攤上這事官疲。” “怎么了亮隙?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵途凫,是天一觀的道長。 經常有香客問我溢吻,道長维费,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮犀盟,結果婚禮上而晒,老公的妹妹穿的比我還像新娘。我一直安慰自己且蓬,他們只是感情好欣硼,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恶阴,像睡著了一般诈胜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冯事,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天焦匈,我揣著相機與錄音,去河邊找鬼昵仅。 笑死缓熟,一個胖子當著我的面吹牛,可吹牛的內容都是我干的摔笤。 我是一名探鬼主播够滑,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吕世!你這毒婦竟也來了彰触?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤命辖,失蹤者是張志新(化名)和其女友劉穎况毅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尔艇,經...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡尔许,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了终娃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片味廊。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尝抖,靈堂內的尸體忽然破棺而出毡们,到底是詐尸還是另有隱情,我是刑警寧澤昧辽,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布衙熔,位于F島的核電站,受9級特大地震影響搅荞,放射性物質發(fā)生泄漏红氯。R本人自食惡果不足惜框咙,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痢甘。 院中可真熱鬧喇嘱,春花似錦、人聲如沸塞栅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽放椰。三九已至作烟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砾医,已是汗流浹背拿撩。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留如蚜,地道東北人压恒。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像错邦,于是被迫代替她去往敵國和親探赫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容