iOS強(qiáng)制橫屏總結(jié)

總體方向兩點(diǎn):
  • model下米间,present方式推出界面强品。
  • push橫屏,帶tabbar屈糊、navigation的榛,且一個(gè)item下所有控制器對(duì)應(yīng)的只有一個(gè)根navigation。

接下來說說push方式強(qiáng)制旋轉(zhuǎn)橫屏?xí)r遇到的坑吧.....

遇到的問題描述:
  • 橫著逻锐,豎屏切換到橫屏夫晌,是否“鎖定豎屏”,都會(huì)偶爾造成無法旋轉(zhuǎn)至橫屏昧诱,iOS8表現(xiàn)較明顯晓淀。
  • 橫著或豎著,切換到橫屏盏档,掛起凶掰,再進(jìn)入橫屏,退出妆丘,再進(jìn)入橫屏锄俄,反復(fù)切換,偶爾會(huì)導(dǎo)致無法橫屏勺拣,返回上豎屏?xí)r奶赠,界面返回了,但橫屏無法返回药有。
  • 橫豎屏來回切換毅戈,跳轉(zhuǎn)苹丸,iOS8下,橫屏控制器,豎屏控制器中init方法苇经,橫屏中viewWillDisapper赘理、viewWillApper,調(diào)用順序會(huì)亂,與iOS7扇单、9執(zhí)行的順序不一樣商模,個(gè)人感覺應(yīng)該是push強(qiáng)制橫屏或都是同一個(gè)navigation導(dǎo)致的原因吧。
小總結(jié)下:
  • 由于該項(xiàng)目橫屏中有來回跳轉(zhuǎn)蜘澜,到處跳轉(zhuǎn)的施流,一個(gè)item下對(duì)應(yīng)的根控制下又只能是同一個(gè)navigation,分享模塊又是基于tabbar上的navigation推出的,分享模塊無回調(diào)鄙信,導(dǎo)致我瞻前顧后的瞪醋,一直盯著push方式到底是否可以強(qiáng)制旋轉(zhuǎn)屏幕........百般絞盡腦汁的研究

  • 思來想去的,就參考了愛奇藝橫屏播放視頻的方式装诡,橫屏中的跳轉(zhuǎn)都先回到豎屏播放控制器中跳轉(zhuǎn)银受,相當(dāng)于橫屏中跳轉(zhuǎn)多了一層過渡控制器;豎屏返回鸦采,應(yīng)該是返回根控制器宾巍,所以,橫屏應(yīng)該是一個(gè)新的navigation,而分享都是在橫屏中處理的赖淤。而我這項(xiàng)目中蜀漆,分享的列表是在tabbar上的navigation加在windows上的,分享跳轉(zhuǎn)都是基于tabbar的navigation咱旱,故無法再新建navigation,否則會(huì)引發(fā)一系列問題确丢,比如無法跳轉(zhuǎn)至首頁,基本上各種在橫屏里面的老代碼跳轉(zhuǎn)方式都不行了吐限。

故此鲜侥,我又回到全部push方式繼續(xù)坑........

因?yàn)槲乙膊幌氚。绻胮resent方式涉及改動(dòng)的代碼模塊太多了.....

其實(shí)有點(diǎn)不明白的是诸典,產(chǎn)品為何如此設(shè)計(jì):橫屏和豎屏描函,全模塊之間的跳轉(zhuǎn),試問這樣真的好嗎.........

接下來分析下push方式狐粱,僅限于參考和積累問題吧:

解決方案:

先說下思路吧:

1.實(shí)時(shí)的更新當(dāng)前應(yīng)用所支持的方向舀寓,手動(dòng)調(diào)用方法-    (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window;
2.把當(dāng)前控制器的方向給到當(dāng)前navigation肌蜻,一定要保證統(tǒng)一互墓,不能亂套,否則會(huì)導(dǎo)致界面來回跳轉(zhuǎn)錯(cuò)亂的問題蒋搜;
3.及時(shí)刷新當(dāng)前控制器,手動(dòng)調(diào)用方法[UIViewController attemptRotationToDeviceOrientation]篡撵。

一判莉、 present方式:
就不多說了,調(diào)用系統(tǒng)的三個(gè)方法育谬,基本上沒什么問題券盅。

二、push方式:

  • 基類tabbar代碼:
    #pragma mark - - orientation
    // 是否支持轉(zhuǎn)屏
    - (BOOL)shouldAutorotate
    {
    return [self.selectedViewController shouldAutorotate];
    }
    // 返回nav棧中的最后一個(gè)對(duì)象支持的旋轉(zhuǎn)方向
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations
    {
    return [self.selectedViewController supportedInterfaceOrientations];
    }
    // 返回nav棧中最后一個(gè)對(duì)象,堅(jiān)持旋轉(zhuǎn)的方向
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
    return [self.selectedViewController preferredInterfaceOrientationForPresentation];
    }

  • 基類navigation代碼:
    //旋轉(zhuǎn)方向 默認(rèn)豎屏
    @property (nonatomic , assign) UIInterfaceOrientation interfaceOrientation;
    @property (nonatomic , assign) UIInterfaceOrientationMask interfaceOrientationMask;

    #pragma mark - - orientation
    //設(shè)置是否允許自動(dòng)旋轉(zhuǎn)
    - (BOOL)shouldAutorotate {
        return YES;
    }
    
    //設(shè)置支持的屏幕旋轉(zhuǎn)方向
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations {
      return self.interfaceOrientationMask;
    }
    
    //設(shè)置presentation方式展示的屏幕方向
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
      return self.interfaceOrientation;
    }
    
  • 基類BaseViewController代碼:
    - (void)viewDidLoad
    {
    [super viewDidLoad];
    [UIViewController attemptRotationToDeviceOrientation];
    }

  • AppDelegate代碼
    @property (assign , nonatomic) BOOL isForceLandscape;
    @property (assign , nonatomic) BOOL isForcePortrait;

    -(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
      if (self.isForceLandscape) {
          return UIInterfaceOrientationMaskLandscape;
      }else if (self.isForcePortrait){
          return UIInterfaceOrientationMaskPortrait;
      }
      return UIInterfaceOrientationMaskPortrait;
    }
    
  • 橫屏viewController代碼:
    重點(diǎn)說明:
    1.此處需要手動(dòng)調(diào)用
    - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window膛檀;
    且設(shè)置當(dāng)前 應(yīng)用只支持橫屏锰镀;
    因?yàn)椋摲椒ㄔ趘iewWillAppear之后執(zhí)行的宿刮。
    2.更新了支持的方向后互站,記得刷新下控制器,調(diào)用:
    [UIViewController attemptRotationToDeviceOrientation];
    否則僵缺,[UIScreen mainScreen].bounds的size不是你期望的;self.view.frame/bounds都不是期望的踩叭。
    3.其實(shí)網(wǎng)上說的一些普通的方式實(shí)現(xiàn)橫屏磕潮,問題多,更多的是因?yàn)閟elf.view.frame/bounds/[UIScreen mainScreen].bounds沒有及時(shí)更新的容贝。

    - (void)viewWillAppear:(BOOL)animated
      {
        [super viewWillAppear:animated];
        //強(qiáng)制旋轉(zhuǎn)豎屏
        [self forceOrientationLandscape];
        CKNavigationController *navi = (CKNavigationController *)self.navigationController;
        [self.navigationController setNavigationBarHidden:YES animated:animated];
        navi.interfaceOrientation =   UIInterfaceOrientationLandscapeRight;
        navi.interfaceOrientationMask = UIInterfaceOrientationMaskLandscapeRight;
    
        //強(qiáng)制翻轉(zhuǎn)屏幕自脯,Home鍵在右邊。
        [[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeRight) forKey:@"orientation"];
        //刷新
        [UIViewController attemptRotationToDeviceOrientation];
    }
    

  重點(diǎn)說明:
  1.離開橫屏?xí)r斤富、橫屏中跳轉(zhuǎn)膏潮,記得強(qiáng)制旋轉(zhuǎn)至豎屏;
  2.如果沒有及時(shí)旋轉(zhuǎn)至橫屏满力,會(huì)導(dǎo)致[UIScreen mainScreen].bounds沒有及時(shí)更新焕参,從而影響其它模塊的布局問題;

 - (void)viewWillDisappear:(BOOL)animated 
  {
    [super viewWillDisappear:animated];
     //強(qiáng)制旋轉(zhuǎn)豎屏
    [self forceOrientationPortrait];
    CKNavigationController *navi = (CKNavigationController *)self.navigationController;
    navi.interfaceOrientation = UIInterfaceOrientationPortrait;
    navi.interfaceOrientationMask = UIInterfaceOrientationMaskPortrait;

     //設(shè)置屏幕的轉(zhuǎn)向?yàn)樨Q屏
    [[UIDevice currentDevice] setValue:@(UIDeviceOrientationPortrait) forKey:@"orientation"];
    //刷新
    [UIViewController attemptRotationToDeviceOrientation];
   }

  #pragma  mark 橫屏設(shè)置
  //強(qiáng)制橫屏
- (void)forceOrientationLandscape
  {
    CKAppDelegate *appdelegate=(CKAppDelegate *)[UIApplication sharedApplication].delegate;
    appdelegate.isForceLandscape=YES;
    appdelegate.isForcePortrait=NO;
    [appdelegate application:[UIApplication sharedApplication] supportedInterfaceOrientationsForWindow:self.view.window];
  }

  //強(qiáng)制豎屏
 - (void)forceOrientationPortrait
  {
    CKAppDelegate *appdelegate=(CKAppDelegate *)[UIApplication sharedApplication].delegate;
    appdelegate.isForcePortrait=YES;
    appdelegate.isForceLandscape=NO;
    [appdelegate application:[UIApplication sharedApplication] supportedInterfaceOrientationsForWindow:self.view.window];
  }

- (BOOL)prefersStatusBarHidden{
    return YES;
}
感受
  • 網(wǎng)上找了很多種方法油额,關(guān)于
    這個(gè)方法有人說上架可能會(huì)被拒叠纷,雖然是間接調(diào)用私有方法。
    但這個(gè)方法經(jīng)過多輪測(cè)試潦嘶,其實(shí)不是有用的涩嚣,不靠譜,只要按照我上面說的步驟測(cè)試掂僵,絕對(duì)會(huì)有bug的航厚,故此不建議大家使用該方法。

     - (void)interfaceOrientation:(UIInterfaceOrientation)orientation{
      if([[UIDevicecurrentDevice] respondsToSelector:@selector(setOrientation:)]) {        
          SEL selector  =NSSelectorFromString(@"setOrientation:");
          NSInvocation*invocation = [NSInvocationinvocationWithMethodSignature:[UIDeviceinstanceMethodSignatureForSelector:selector]];     
          [invocation setSelector:selector];        
          [invocation setTarget:[UIDevicecurrentDevice]];
          intval = orientation;
          // 從2開始是因?yàn)? 1 兩個(gè)參數(shù)已經(jīng)被selector和target占用
          [invocation setArgument:&val atIndex:2];                                                     
          [invocation invoke];   
      }}
    

以上所述锰蓬,支持iOS7幔睬、8、9系統(tǒng)互妓,經(jīng)iphone \iPod測(cè)試過溪窒,但貌似iOS8從橫屏挑戰(zhàn)至其它豎屏的界面坤塞,偶爾會(huì)有問題,概率很小澈蚌,不影響摹芙。
原因:可能是iOS8 SDK與其它不同吧。

更新iOS8的問題:

   iOS8-8.4宛瞄,橫屏跳轉(zhuǎn)至其它界面浮禾,最好延遲跳轉(zhuǎn),不然其它界面的viewWillApper會(huì)比橫屏的viewWillDisApper先執(zhí)行份汗,導(dǎo)致無法旋轉(zhuǎn)回來盈电。
   CGFloat timef = 0.8;
    //主要是轉(zhuǎn)屏之后view的再次旋轉(zhuǎn)
    if (kSystemVersion>8||kSystemVersion<8.4) {
        self.view.hidden = YES;
        [self viewWillDisappear:NO];
        timef = 0.1;
    }
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, timef*NSEC_PER_SEC);
    dispatch_after(time, dispatch_get_main_queue(), ^{
        dispatch_async(dispatch_get_main_queue(), ^(){
           //跳轉(zhuǎn)界面
        });
    });

參考資料:
http://www.cocoachina.com/bbs/read.php?tid=244119

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杯活,隨后出現(xiàn)的幾起案子匆帚,更是在濱河造成了極大的恐慌,老刑警劉巖旁钧,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吸重,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡歪今,警方通過查閱死者的電腦和手機(jī)嚎幸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寄猩,“玉大人嫉晶,你說我怎么就攤上這事√锲” “怎么了替废?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)斯辰。 經(jīng)常有香客問我舶担,道長(zhǎng),這世上最難降的妖魔是什么彬呻? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任衣陶,我火速辦了婚禮,結(jié)果婚禮上闸氮,老公的妹妹穿的比我還像新娘剪况。我一直安慰自己,他們只是感情好蒲跨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布译断。 她就那樣靜靜地躺著,像睡著了一般或悲。 火紅的嫁衣襯著肌膚如雪孙咪。 梳的紋絲不亂的頭發(fā)上堪唐,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音翎蹈,去河邊找鬼淮菠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛荤堪,可吹牛的內(nèi)容都是我干的合陵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼澄阳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拥知!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碎赢,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤低剔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后揩抡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體户侥,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年峦嗤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屋摔。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烁设,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钓试,到底是詐尸還是另有隱情装黑,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布弓熏,位于F島的核電站恋谭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挽鞠。R本人自食惡果不足惜疚颊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望信认。 院中可真熱鬧材义,春花似錦、人聲如沸嫁赏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘央。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腐螟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工徙歼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酿矢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓盔夜,卻偏偏與公主長(zhǎng)得像负饲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喂链,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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