iOS 視頻橫豎屏處理實現(xiàn)邏輯

在項目過程中,有視頻橫豎屏切換的邏輯,但是在各種嘗試之后,個人感覺,在關(guān)閉掉app在當(dāng)前頁面橫豎屏支持,處理起來邏輯最簡單,但是我們又不能不支持用戶自己橫豎手機(jī)時候的動態(tài)支持,所以,我在自己的項目中通過監(jiān)聽設(shè)備信息來處理橫豎屏邏輯(可以簡單的避免有些用戶進(jìn)入到我們支持自動旋轉(zhuǎn)屏幕頁面的時候,當(dāng)時的設(shè)備就是橫屏的時候的一些問題,我們之間避開了)
個人實現(xiàn)邏輯如下:
1.進(jìn)入播放器頁面 確定當(dāng)前設(shè)備狀態(tài)及未進(jìn)行橫豎屏?xí)r 播放器視圖的位置及視圖關(guān)系
2.用戶點擊橫屏/豎屏,或者用戶手動旋轉(zhuǎn)的時候,進(jìn)行邏輯處理,將播放器從之前的父視圖移動到window上,然后將播放器旋轉(zhuǎn)正負(fù)90度(左橫屏和右橫屏,其實此時frame會變,寬高顛倒),然后調(diào)整播放器的frame為全屏), 反之,將播放器從window恢復(fù)到原父視圖(旋轉(zhuǎn)回復(fù)到0),然后修改frame即可

具體細(xì)節(jié)如下:
1.在進(jìn)入播放器頁面的時候,首先獲取當(dāng)前設(shè)備的狀態(tài),左橫屏?右橫屏?豎屏?代碼如下:

//以后還需要監(jiān)聽屏幕旋轉(zhuǎn) 和進(jìn)入后臺等操作
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doRotateAction:) name:UIDeviceOrientationDidChangeNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidEnterBackGround:) name:UIApplicationDidEnterBackgroundNotification object:nil];
UIInterfaceOrientation sataus=[UIApplication sharedApplication].statusBarOrientation;
 if (sataus == UIDeviceOrientationLandscapeLeft) {
   self.currentOrientation = UIDeviceOrientationLandscapeLeft;
 }else if (sataus == UIDeviceOrientationLandscapeRight){
  self.currentOrientation = UIDeviceOrientationLandscapeRight;
 }else{
   self.currentOrientation = UIDeviceOrientationPortrait;
 }

2.然后構(gòu)造播放器和視圖,效果如圖:

Untitled12.gif

3.然后監(jiān)聽設(shè)備狀態(tài):
代碼如下:

//實現(xiàn)監(jiān)聽的通知方法:
- (void)doRotateAction:(NSNotification *)notification {
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) {
       self.currentOrientation = UIDeviceOrientationPortrait;
        if (isfullScreen) {
            [self changeScreenFullScreen:NO];
        }
    } else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) {
        if (self.currentOrientation == UIDeviceOrientationLandscapeLeft && isfullScreen ) {
            return;
        }
        self.currentOrientation = UIDeviceOrientationLandscapeLeft;
        [self changeScreenFullScreen:YES];
    }else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight){
        if (self.currentOrientation == UIDeviceOrientationLandscapeRight && isfullScreen ) {
            return;
        }
        self.currentOrientation = UIDeviceOrientationLandscapeRight;
        [self changeScreenFullScreen:YES];
    }
}

  1. 關(guān)鍵的處理橫豎屏的代碼
//是否全屏
- (void)changeScreenFullScreen:(BOOL)fullScreen{
//    if (!self.needDealTransForm) {
//        NSLog(@"當(dāng)前代碼不允許橫豎屏 根據(jù)個人的邏輯來處理");
//        return;
//    }
    [UIView animateWithDuration:0.3 animations:^{
        if (fullScreen) {
            //是全屏
            [[UIApplication sharedApplication]setStatusBarHidden:YES];
            [self removeFromSuperview];
            UIWindow *window = [self mainWindow];
            topView.hidden = NO ;
            [window addSubview:self];
            if (self.currentOrientation == UIDeviceOrientationLandscapeLeft) {
                self.transform  =CGAffineTransformMakeRotation(M_PI_2);
            }else if (self.currentOrientation == UIDeviceOrientationLandscapeRight){
                self.transform  =CGAffineTransformMakeRotation(-M_PI_2);
            }else{
                self.transform  =CGAffineTransformMakeRotation(M_PI_2);
            }
            self.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);
            bottomView.frame = CGRectMake(0, ScreenWidth-40, ScreenHeight, 40);
            topView.frame = CGRectMake(0, 0, ScreenHeight, 40);
            isfullScreen = YES;
            [changeFullScreenBtn setImage:[UIImage imageNamed:@"ox"] forState:UIControlStateNormal];
            return;
        }else{
            [[UIApplication sharedApplication]setStatusBarHidden:NO];
            self.transform  =CGAffineTransformMakeRotation(0);
            self.frame = originFrame;
            bottomView.frame = CGRectMake(0, self.frame.size.height-40, ScreenWidth, 40);
            topView.hidden = YES;
            [self removeFromSuperview];
            [changeFullScreenBtn setImage:[UIImage imageNamed:@"dk"] forState:UIControlStateNormal];
            [_parentView addSubview:self];
            isfullScreen = NO;
        }
    }];
}

以上,基本上播放器橫豎屏功能已經(jīng)實現(xiàn),上面可能會有同學(xué)告訴我,為什么我既用frame,還用masonry,其實,我使用frame我沒辦法,當(dāng)我使用masonry設(shè)置播放器代理里面的bottomeView和topView的時候 ,旋轉(zhuǎn)的時候, 在iOS 11上效果是我們期望的效果,但是在iOS其他版本(個人試了iOS 10 和iOS 8)效果不是我們期望的那樣,后來也沒想明白,如果有朋友或者同學(xué)了解具體原因,可以給我指導(dǎo)一下,謝謝大家!
順便給大家上個demo: https://github.com/yangfangkuo/VideoOrientationTransform

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莫瞬,一起剝皮案震驚了整個濱河市艾猜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖狰闪,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件败许,死亡現(xiàn)場離奇詭異怒允,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)享言,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門荧琼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來命锄,“玉大人,你說我怎么就攤上這事偏化∑甓鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵侦讨,是天一觀的道長驶冒。 經(jīng)常有香客問我,道長韵卤,這世上最難降的妖魔是什么骗污? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮怜俐,結(jié)果婚禮上身堡,老公的妹妹穿的比我還像新娘。我一直安慰自己拍鲤,他們只是感情好贴谎,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著季稳,像睡著了一般擅这。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上景鼠,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天仲翎,我揣著相機(jī)與錄音痹扇,去河邊找鬼。 笑死溯香,一個胖子當(dāng)著我的面吹牛鲫构,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玫坛,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼结笨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了湿镀?” 一聲冷哼從身側(cè)響起炕吸,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勉痴,沒想到半個月后赫模,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡蒸矛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年瀑罗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莉钙。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡廓脆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出磁玉,到底是詐尸還是另有隱情停忿,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布蚊伞,位于F島的核電站席赂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏时迫。R本人自食惡果不足惜颅停,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掠拳。 院中可真熱鬧癞揉,春花似錦、人聲如沸溺欧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姐刁。三九已至芥牌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聂使,已是汗流浹背壁拉。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工谬俄, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弃理。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓溃论,卻偏偏與公主長得像,于是被迫代替她去往敵國和親案铺。 傳聞我的和親對象是個殘疾皇子蔬芥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫梆靖、插件控汉、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評論 4 62
  • 昨天杭州迎來了2018年的第一場雪,剛巧碰上臘八節(jié)返吻。我是第一次聽說臘八節(jié)的習(xí)俗姑子,雖然在家鄉(xiāng)我就知道這個節(jié)日,但并沒...
    摩天輪下的遇見gz閱讀 274評論 2 6
  • 昵稱:黑白流派 坐標(biāo):家鄉(xiāng)在美麗的貴州,暫居春城昆明捍靠。 聯(lián)系方式:主頁上有 交友宣言:生活是一首美妙的詩沐旨,遇見便是...
    歌奕鳴閱讀 1,109評論 36 31
  • 初中的時候,在加無聊沒事做榨婆,只會看看小說磁携,玩玩游戲,看看劇良风。我記得那時的我最喜歡看的就是那種青春偶像劇谊迄,那是正好有...
    非洲版古川雄輝閱讀 132評論 0 1