iOS - 橫豎屏相關篇

以前都是將知識點寫在 《iOS - 小常識知識點這篇文章》 ,但是后來累積的太多儒鹿,所以還是決定抽時間按功能模塊抽分出來化撕!

   0.點項目 - Targets - General - Deployment Info ,如圖
C70563D6-8465-4F95-A2BA-B26519663417.png

第一约炎、默認所有豎屏之強制橫屏版 -- UIDevice 和 Animation 版 (無需解鎖即可強制橫豎屏)

    1.項目名稱 - TARGETS - General - Deployment Info - Device Orientation , 勾選Portrait 植阴!

    2.創(chuàng)建按鈕,并實現(xiàn)點擊按鈕圾浅,強制橫屏

            UIView *navView = [[UIView alloc] initWithFrame:CGRectMake(10, 64+10, WIDTH-20, 200)];
            navView.backgroundColor = [UIColor clearColor];
            [self.view addSubview:navView];
            UIButton *testBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            testBtn.backgroundColor = SLIVERYCOLOR;
            testBtn.frame = CGRectMake(0, 170, 50, 30);
            [navView addSubview:testBtn];
            [testBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];    

            - (void)btnClick:(UIButton *)sender{
                sender.selected = !sender.selected;
                [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
                [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
                if (sender.selected) {
                    [self interfaceOrientation:UIInterfaceOrientationLandscapeRight];
                }else{
                    [self interfaceOrientation:UIInterfaceOrientationPortrait];
                }
            }
            
            - (void)interfaceOrientation:(UIInterfaceOrientation)orientation
            {
                if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
                    SEL selector             = NSSelectorFromString(@"setOrientation:");
                    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
                    [invocation setSelector:selector];
                    [invocation setTarget:[UIDevice currentDevice]];
                    int val                  = orientation;
                    // 從2開始是因為0 1 兩個參數(shù)已經(jīng)被selector和target占用
                    [invocation setArgument:&val atIndex:2];
                    [invocation invoke];
                }
            }
            
            - (void)deviceOrientationDidChange
            {
                NSLog(@"NAV deviceOrientationDidChange:%ld",(long)[UIDevice currentDevice].orientation);
                if([UIDevice currentDevice].orientation == UIDeviceOrientationPortrait) {
                    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:YES];
                    [self orientationChange:NO];
                    //注意: UIDeviceOrientationLandscapeLeft 與 UIInterfaceOrientationLandscapeRight
                } else if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft) {
                    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
                    [self orientationChange:YES];
                }
            }
            
            - (void)orientationChange:(BOOL)landscapeRight
            {
                if (landscapeRight) {
                    [UIView animateWithDuration:0.2f animations:^{
                        self.view.transform = CGAffineTransformMakeRotation(M_PI_2);
                        self.view.bounds = CGRectMake(0, 0, WIDTH, HEIGHT);
                    }];
                } else {
                    [UIView animateWithDuration:0.2f animations:^{
                        self.view.transform = CGAffineTransformMakeRotation(0);
                        self.view.bounds = CGRectMake(0, 0, WIDTH, HEIGHT);
                    }];
                }
            }
            
            - (BOOL)shouldAutorotate
            {
                return NO;
            }

    3.如果該橫屏控制器為根控制器墙贱,此步忽視!如果該橫屏控制器為導航控制器下的子控制器贱傀,或者是tabbar控制器下的導航控制器下的子控制器惨撇,則需要重寫 父控制器的 shouldAutorotate 方法直到跟控制器未知!

   #pragma mark - 注意點:必須重寫父類控制器直至根控制器府寒!在重寫方法的 shouldAutorotate 方法里面?zhèn)魅胄枰獧M屏的控制器魁衙!

    #pragma mark - 旋轉相關 (tabbar控制器下的子控制器需要旋轉需要重寫此方法报腔,且需要旋轉哪個控制器就傳入哪個)
    - (BOOL)shouldAutorotate
    {
        //在viewControllers中返回需要改變的NavigationController
        //由于此處項目中只有一個基類導航控制器,所以五個控制器名稱相同剖淀,就取 要橫屏的第四個導航控制器 - self.viewControllers[3]
        return [self.viewControllers[3] shouldAutorotate];
    }

    #pragma mark - 旋轉相關 (導航控制器下的子控制器需要旋轉需要重寫此方法纯蛾,且需要旋轉哪個控制器就傳入哪個)

    - (BOOL)shouldAutorotate
    {
        //在viewControllers中返回需要改變的viewController
        for (id obj in self.viewControllers) {
            if ([obj isKindOfClass:[MSUPlayerController class]]) {
                return [obj shouldAutorotate];
            }
        }
        return 0;
    }

第二、默認所有豎屏之強制橫屏版 -- AppDelegate BOOL版 (需手動解鎖鎖屏按鈕方可橫豎屏)

    0.項目名稱 - TARGETS - General - Deployment Info - Device Orientation , 勾選Portrait 纵隔!

    1.在 appdelegate 頭文件中添加屬性

        /// 判斷是否橫豎屏
        @property (nonatomic,assign)BOOL allowRotation;

    2.在 appdelegate.m 文件中實現(xiàn)方法

        /* 橫豎屏 */
        - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
            if (self.allowRotation) {
                return  UIInterfaceOrientationMaskAllButUpsideDown;
            }
            return UIInterfaceOrientationMaskPortrait;
        }

    3.在需要橫屏的文件中翻诉,導入頭文件 #import "AppDelegate.h" ,添加如此代碼

        /// 橫豎屏相關
        AppDelegate *app =(AppDelegate *)[[UIApplication sharedApplication] delegate];
        app.allowRotation = YES;

第三捌刮、UI適配版

1.控制器中橫豎屏如何分寫

    1).在控制器中的  viewWillLayoutSubviews 中分橫豎屏情況寫控件 frame

        - (void)viewWillLayoutSubviews {
                [super viewWillLayoutSubviews];
                // 通過狀態(tài)欄電池圖標來判斷屏幕方向
                if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) {
                    // 豎屏 balabala
                } else {
                    // 橫屏 balabala
                }
        }

    2).在控制器中的 viewWillTransitionToSize 中分橫豎屏情況寫控件 frame
        - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
            
            if (size.width > size.height) { // 橫屏
                // 橫屏布局 balabala
            } else {
                // 豎屏布局 balabala
            }
        }

2.UIView 中橫豎屏如何分寫

    - (void)layoutSubviews{
        [super layoutSubviews];
        if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) {
            // 豎屏 balabala
        } else {
            // 橫屏 balabala
        }
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末碰煌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绅作,更是在濱河造成了極大的恐慌芦圾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俄认,死亡現(xiàn)場離奇詭異个少,居然都是意外死亡,警方通過查閱死者的電腦和手機眯杏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門夜焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岂贩,你說我怎么就攤上這事茫经。” “怎么了河闰?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褥紫。 經(jīng)常有香客問我姜性,道長,這世上最難降的妖魔是什么髓考? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任部念,我火速辦了婚禮,結果婚禮上氨菇,老公的妹妹穿的比我還像新娘儡炼。我一直安慰自己,他們只是感情好查蓉,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布乌询。 她就那樣靜靜地躺著,像睡著了一般豌研。 火紅的嫁衣襯著肌膚如雪妹田。 梳的紋絲不亂的頭發(fā)上唬党,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音鬼佣,去河邊找鬼驶拱。 笑死,一個胖子當著我的面吹牛晶衷,可吹牛的內容都是我干的蓝纲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晌纫,長吁一口氣:“原來是場噩夢啊……” “哼税迷!你這毒婦竟也來了?” 一聲冷哼從身側響起缸匪,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翁狐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凌蔬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體露懒,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年砂心,在試婚紗的時候發(fā)現(xiàn)自己被綠了懈词。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩诞,死狀恐怖坎弯,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情译暂,我是刑警寧澤抠忘,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站外永,受9級特大地震影響崎脉,放射性物質發(fā)生泄漏。R本人自食惡果不足惜伯顶,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一囚灼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祭衩,春花似錦灶体、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至路克,卻和暖如春织中,著一層夾襖步出監(jiān)牢的瞬間锥涕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工狭吼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留层坠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓刁笙,卻偏偏與公主長得像破花,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疲吸,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容

  • 1.監(jiān)聽屏幕旋轉方向 在處理iOS橫豎屏時座每,經(jīng)常會和UIDeviceOrientation、UIInterface...
    彬至睢陽閱讀 2,536評論 1 6
  • iOS 中橫豎屏切換的功能摘悴,在開發(fā)iOS app中總能遇到峭梳。以前看過幾次,感覺簡單蹂喻,但是沒有敲過代碼實現(xiàn)葱椭,最近又碰...
    零度_不結冰閱讀 2,184評論 0 0
  • [這是第11篇] 導語: iOS App中大多數(shù)頁面是只展示豎屏下的效果,但是少部分頁面需要支持橫豎屏口四。本文分別介...
    南華coder閱讀 14,495評論 18 93
  • 一年多了孵运,一五年年尾我第一次和紅月老師見面,參加了北京的瑪雅歷學習班蔓彩,到今年二月中旬的上海分享會治笨,這一年多的等待和...
    林墨KELLY閱讀 627評論 1 3
  • 2017年7月3日 晴 吃了一半的桃子 也發(fā)黃了 一半的粗燥右手 麻木靜止了 寫了一半的日記 內容干枯了 現(xiàn)在意識...
    鮮栗子閱讀 195評論 1 2