iOS 橫豎屏切換

背景: 項目作為SDK接入到游戲項目中肢扯,切游戲是橫屏妒茬,SDK只支持豎屏,在xCode11上編譯包會出現(xiàn)一個瞬間的抖動問題

如何支持橫豎屏切換

  • navigation中實現(xiàn):
//// For ios6, use supportedInterfaceOrientations & shouldAutorotate instead
- (UIInterfaceOrientationMask) supportedInterfaceOrientations{
    return [self.viewControllers.lastObject supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}

- (BOOL) shouldAutorotate {
    return [self.viewControllers.lastObject shouldAutorotate];
}
  • ViewController中實現(xiàn):
//// For ios6, use supportedInterfaceOrientations & shouldAutorotate instead
- (UIInterfaceOrientationMask) supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

- (BOOL) shouldAutorotate {
    return YES; //這里一定要是yes   如果是NO 就不支持自動切換蔚晨,也不會繼續(xù)調(diào)用另外兩個方法了
}

--- 以上對xcode10及以前模擬器都沒問題 ---

那么 xCode11 iOS 13 針對modalStyle推出了新特性乍钻,presentViewController的時候需要強制添加fullScreen的modalStyle,就會導致在橫屏切換到豎屏的過程中出現(xiàn)一個詭異的抖動铭腕,那么問題來了银择,fullScreen到底做了什么,和之前的present 有和區(qū)別呢

這篇文章寫的還是挺詳細的

A->B 的情況下累舷,用fullScreen的話 會調(diào)用presentedViewController的viewlayoutsubviews導致重新布局 有一個切換 閃一下


image.png

這里有兩個方案

方案一

fullScreen模式下 在頁面A里攔截一下這種情況下 攔截一下頁面

方案二

使用overFullScreen 模式浩考,但這個模式在橫豎屏下會引發(fā)一系列連鎖反應,系統(tǒng)不會幫你強制豎屏被盈,當你presentingViewcontroller里實現(xiàn)了

- (BOOL) shouldAutorotate {
    return YES; 
}

相關(guān)代理之后析孽,他能夠根據(jù)當前window來實現(xiàn)頁面的橫豎屏轉(zhuǎn)換,到這里 只怎,如果你的需求已經(jīng)滿足了袜瞬,那么恭喜你,你已經(jīng)成功了身堡。下面內(nèi)容可以忽略了~

因為用到了鍵盤和UIMenuController邓尤,而這兩個東西并不在當前 application的keywindow上,下面可以看到,而我們要用到的鍵盤和Menu其實都是依附于UITextEffectsWindow上的


開啟圖層渲染

當我們使用overFullScreent的style汞扎,橫屏進入頁面的時候季稳,系統(tǒng)其實并不會將 UITextEffectsWindow 這個window自動旋轉(zhuǎn)為豎屏,系統(tǒng)判定當前仍然是橫屏澈魄,name鍵盤和menu仍然是按照橫屏的高度去計算的景鼠,這就會有問題,針對這種case一忱,目前用了一個比較迂回(一個坑一個坑去填)的解決辦法。

  • 在present的時機 調(diào)用豎屏:
- (void)rotationToDeviceOrientation {
    
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:@selector(setOrientation:)]];
    invocation.selector = NSSelectorFromString(@"setOrientation:");
    invocation.target = [UIDevice currentDevice];
    int initOrientation = UIDeviceOrientationPortrait; // 這里我們需要傳的值是設(shè)備方向值
    [invocation setArgument:&initOrientation atIndex:2];
    [invocation invoke];

    /** 下面代碼是為了當前導航欄旋轉(zhuǎn)至設(shè)備方向*/
    [CCBaseNavigationController attemptRotationToDeviceOrientation];
}

  • 處理鍵盤 或 Menu 在橫屏presentVC的時候谭确,顯示問題帘营,這里會有一個小特點,就是當APP從后臺切換會前臺之后逐哈,會觸發(fā)系統(tǒng)的刷新芬迄,這個時候能夠刷新,所以我們這里處理的就是這個極端case的UI顛倒顯示的問題

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(adjustKeyboardWindow) name:UIApplicationDidBecomeActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];

/*
 這是一處及其惡心的代碼昂秃,為了適配iOS13橫豎屏切換的問題禀梳,
 iOS13上用 overfullScreen present的VC,進入頁面
 UITextEffectsWindow window不會切換豎屏肠骆,所以這里需要暴力扭轉(zhuǎn)一下
 心虛的說一下  不知道會有啥坑  見招拆招吧~
 **/
- (void)adjustKeyboardWindow {
    if (@available(iOS 13.0, *)) {
        NSUInteger windowCount = [[[UIApplication sharedApplication] windows] count];
        if(windowCount < 2) {
            return;
        }
        UIWindow *keyboardWindow = nil;
        if(windowCount >= 2)//ios9以上算途,UIRemoteKeyboardWindow
        {
           keyboardWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
        }
        if (keyboardWindow.wind_width > keyboardWindow.wind_height) {
            keyboardWindow.transform = CGAffineTransformMakeRotation(-M_PI_2);
            self.isAdjustKeyboardFrame = YES;
        } else {
            keyboardWindow.transform = CGAffineTransformMakeRotation(0);
            self.isAdjustKeyboardFrame = NO;
        }
        keyboardWindow.bounds = CGRectMake(0, 0, WindCS_SCREEN_MIN_LENGTH, WindCS_SCREEN_MAX_LENGTH);
    }
    
}



- (void)deviceOrientationDidChange:(NSNotification *)notificationn {
    [self adjustKeyboardWindow];
}


以上希望能夠幫助到有需要的朋友,有問題進一步溝通~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚀腿,一起剝皮案震驚了整個濱河市嘴瓤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莉钙,老刑警劉巖廓脆,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異磁玉,居然都是意外死亡停忿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門蚊伞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來席赂,“玉大人,你說我怎么就攤上這事时迫⊙踉妫” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵别垮,是天一觀的道長。 經(jīng)常有香客問我烧董,道長逊移,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮扇商,結(jié)果婚禮上案铺,老公的妹妹穿的比我還像新娘。我一直安慰自己笔诵,他們只是感情好乎婿,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布次酌。 她就那樣靜靜地躺著舆乔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪希俩。 梳的紋絲不亂的頭發(fā)上颜武,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音这吻,去河邊找鬼篙议。 笑死怠硼,一個胖子當著我的面吹牛移怯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葡秒,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赖草!你這毒婦竟也來了疚顷?” 一聲冷哼從身側(cè)響起腿堤,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤笆檀,失蹤者是張志新(化名)和其女友劉穎盒至,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體樱衷,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年酒唉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痪伦。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖网沾,靈堂內(nèi)的尸體忽然破棺而出癞蚕,到底是詐尸還是另有隱情辉哥,我是刑警寧澤桦山,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響度苔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寇窑,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一甩骏、第九天 我趴在偏房一處隱蔽的房頂上張望窗市。 院中可真熱鬧,春花似錦摄狱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至次泽,卻和暖如春穿仪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背意荤。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工啊片, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玖像。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓紫谷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親御铃。 傳聞我的和親對象是個殘疾皇子碴里,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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

  • iOS 中橫豎屏切換的功能,在開發(fā)iOS app中總能遇到上真。以前看過幾次咬腋,感覺簡單,但是沒有敲過代碼實現(xiàn)睡互,最近又碰...
    零度_不結(jié)冰閱讀 2,195評論 0 0
  • iOS 橫豎屏切換解決方案 前言 在大多數(shù)項目中根竿,App 的 UI 方向都是豎屏的陵像,所以一般會在 target 中...
    yizhaorong閱讀 15,379評論 3 68
  • 本文只針對單個界面橫豎屏界面 1.首先在TARGETS中將橫豎屏勾選上(不用勾選貌似也可以,只不過需要在AppDe...
    低調(diào)的前行者灬閱讀 2,430評論 0 2
  • 在網(wǎng)上找iOS橫屏相關(guān)的信息時發(fā)現(xiàn)只有進入頁面強制橫屏的代碼,并沒有在一個頁面通過點擊按鈕的方式實現(xiàn)當前屏幕的橫豎...
    iOS_Edward閱讀 1,746評論 4 1
  • 網(wǎng)上關(guān)于橫豎屏切換的資料很多,但是很容易踩到坑寇壳,不是屏幕不旋轉(zhuǎn)醒颖,就是屏幕旋轉(zhuǎn)后沒有狀態(tài)欄等,在寫的小demo里屏幕...
    凌云01閱讀 546評論 0 0