iOS 屏幕旋轉(zhuǎn)shouldAutorotate

最近項目中有個分時圖的顯示需要進行橫屏處理。因為整個項目里面大部分頁面都是需要豎屏顯示的辜妓。只有幾個頁面是橫屏顯示矾克。

一.希望達到的效果

1.進行app默認的頁面顯示為豎屏,且不可切換橫豎屏捏鱼。
2.進行特定頁面的時候可以切換為橫屏执庐。且離開頁面進行豎屏頁面的時候可以自動顯示豎屏頁面。
3.保證push present和對應(yīng)的pop和dismiss正常顯示导梆。

二.解釋必要的幾個方法

- (BOOL)shouldAutorotate{
    return NO;
}

此方法用來設(shè)置是否讓頁面支持自動旋轉(zhuǎn)屏幕轨淌,return YES既可以自動旋轉(zhuǎn)屏幕。NO就不能自動旋轉(zhuǎn)屏幕看尼。

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

此方法用來設(shè)置當前頁面支持的屏幕方向
UIInterfaceOrientationMask是一個枚舉递鹉,具體含義如下:
UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),//向上為正方向的豎屏
UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),//向左移旋轉(zhuǎn)的橫屏
UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),//向右旋轉(zhuǎn)的橫屏
UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),//向下為正方向的豎屏
UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),//向左或者向右的橫屏
UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),//所有的橫豎屏方向都支持
UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),//支持向上的豎屏和左右方向的橫屏

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}

UIInterfaceOrientation是一個枚舉,取值如下
UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown,//屏幕方向未知
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,//向上正方向的豎屏
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,//向下正方向的豎屏
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,//向右旋轉(zhuǎn)的橫屏
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft//向左旋轉(zhuǎn)的橫屏
此方法用來設(shè)置當前頁面默認第一次進入的時候顯示的屏幕方向

三.實現(xiàn)原理講解

原理概述:
1.我們對項目的info.plist設(shè)置全局只支持橫屏藏斩,保證項目進入的時候自動進入橫屏躏结。
2.然后再使用以上三個方法對具體的每個控制器進行單獨的設(shè)置,保證每個控制器自身的橫屏豎屏表現(xiàn)合理灾茁。

三種情況:

  • 沒被navigationController和tabBarController作為子控制器的Controller
  • 在navigationController里面嵌套的Controller
  • 在TabbarController里面嵌套的Controller
    1.對于沒有被navigation和Tabbar嵌套窜觉,即跳轉(zhuǎn)方式如下的控制器:
UIViewController *vc = [[UIViewController alloc]init];
[self presentViewController:vc animated:YES completion:nil];
- (BOOL)shouldAutorotate{
    return NO;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}

只需要實現(xiàn)這個三個方法。像這樣的設(shè)置北专,即可保證Controller是豎屏的表現(xiàn)禀挫,且不可以自動進行橫屏豎屏切換。
2.對于被NavigationController嵌套的Controller.即跳轉(zhuǎn)方式如下的控制器

NaviViewController *navController = [[NaviViewController alloc]init];
QXNavigationViewController *navigationController = [[QXNavigationViewController alloc]initWithRootViewController:navController];
[self presentViewController:navigationController animated:YES completion:nil];

對于這樣的控制器我們除了需要在controller控制器里實現(xiàn)上面的三個方法之外拓颓,還需要在QXNavigationViewController(自定義)實現(xiàn)以下的方法:

- (BOOL)shouldAutorotate{
    return [self.visibleViewController shouldAutorotate];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    return [self.visibleViewController supportedInterfaceOrientations];
}

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

實現(xiàn)完成這三個方法即可保證语婴。navigationController的橫豎屏表現(xiàn)會依照他的rootViewController的設(shè)置來表現(xiàn)。
3.對于在TabbarController里面嵌套的Controller驶睦。即創(chuàng)建方式如下:

- (void)setInitTabBar{
    NSArray *baseArray = @[@"ViewController",@"SecondViewController",@"NaviViewController"];
    for (NSInteger i = 0; i < baseArray.count; i++){
        Class cls = NSClassFromString(baseArray[i]);
        QXNavigationViewController *naviController = [[QXNavigationViewController alloc]initWithRootViewController:[[cls alloc]init]];
        [self addChildViewController:naviController];
    }
}

controller作為tabbar的childViewController,依照第二種情況我們同樣需要在QXTabBarController里面實現(xiàn)三個方法砰左,保證tabbarController會依照它保存的子控制器的設(shè)置來渲染:

- (BOOL)shouldAutorotate{
    return [self.selectedViewController shouldAutorotate];
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    return [self.selectedViewController supportedInterfaceOrientations];
}

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

四.注意點

這種方式設(shè)置完成了以后會有一個小坑。就是從頁面A(豎屏狀態(tài))跳轉(zhuǎn)到NavigationController或者tabbarController包裹的控制器以后场航,如果控制器允許橫屏缠导。并且切換為橫屏,直接pop或者dismiss回來會讓頁面A仍然保持橫屏狀態(tài)溉痢。對于這個問題我的處理建議是:
1.如果是push進入的controller那么就在頁面A的viewWillAppear里面加上如下方法:

- (void)viewWillAppear:(BOOL)animated{
    NSNumber * value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}

2.如果是從頁面A present方式跳轉(zhuǎn)的頁面僻造、那么就將頁面A的方法

//- (BOOL)shouldAutorotate{
//    return NO;
//}

注釋掉。
這些方法可以保證controller在返回頁面A的時候自動調(diào)整橫豎屏的顯示效果孩饼。
本文Demo
本文內(nèi)容皆為原創(chuàng)髓削,有任何問題歡迎各外朋友指正,一塊交流镀娶。
本文參考內(nèi)容為:燃燒的大叔
iOS 關(guān)于屏幕旋轉(zhuǎn)shouldAutorotate

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末立膛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梯码,更是在濱河造成了極大的恐慌宝泵,老刑警劉巖好啰,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲁猩,居然都是意外死亡坎怪,警方通過查閱死者的電腦和手機罢坝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門廓握,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘁酿,你說我怎么就攤上這事隙券。” “怎么了闹司?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵娱仔,是天一觀的道長。 經(jīng)常有香客問我游桩,道長牲迫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任借卧,我火速辦了婚禮盹憎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铐刘。我一直安慰自己陪每,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布镰吵。 她就那樣靜靜地躺著檩禾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疤祭。 梳的紋絲不亂的頭發(fā)上盼产,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音勺馆,去河邊找鬼戏售。 笑死,一個胖子當著我的面吹牛谓传,可吹牛的內(nèi)容都是我干的蜈项。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼续挟,長吁一口氣:“原來是場噩夢啊……” “哼紧卒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诗祸,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤跑芳,失蹤者是張志新(化名)和其女友劉穎轴总,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體博个,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡怀樟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盆佣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片往堡。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖共耍,靈堂內(nèi)的尸體忽然破棺而出虑灰,到底是詐尸還是另有隱情,我是刑警寧澤痹兜,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布穆咐,位于F島的核電站,受9級特大地震影響字旭,放射性物質(zhì)發(fā)生泄漏对湃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一遗淳、第九天 我趴在偏房一處隱蔽的房頂上張望拍柒。 院中可真熱鬧,春花似錦洲脂、人聲如沸斤儿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽往果。三九已至,卻和暖如春一铅,著一層夾襖步出監(jiān)牢的瞬間陕贮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工潘飘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肮之,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓卜录,卻偏偏與公主長得像戈擒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子艰毒,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348