iOS - 橫豎屏相關篇

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

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

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

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

    2.創建按鈕,并實現點擊按鈕,強制橫屏

            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 兩個參數已經被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 方法里面傳入需要橫屏的控制器!

    #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 文件中實現方法

        /* 橫豎屏 */
        - (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];
                // 通過狀態欄電池圖標來判斷屏幕方向
                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
        }
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

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