iOS 之強(qiáng)制橫豎屏問題

1、 iOS開發(fā)中一般情況只會用到豎屏甘凭,但有些app 的個別頁面卻要變成橫屏柬批,所以在很豎屏的切換就是一個經(jīng)常用到的問題。

  • 一般情況下會用到一下幾個方法
// 是否支持屏幕旋轉(zhuǎn)
- (BOOL)shouldAutorotate {
    return YES;
}

//  設(shè)置特殊的界面支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    // 當(dāng)前設(shè)備支持的方向(橫屏方向) 
    return UIInterfaceOrientationMaskLandscape; 
}

// 當(dāng)前設(shè)備的屏幕方向
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentatio {
// 當(dāng)前設(shè)備的屏幕方向(home 鍵在右邊)
    return UIInterfaceOrientationLandscapeRight;
}

如果有 UINavigationController 或者是 UITabBarController 等這些容器控制器的時候拐邪,上面方法就沒有了慰毅,底層控制器不是一般的 UIViewController

  • 所以需要在 UINavigationController 里面實現(xiàn)
// 是支持屏幕旋轉(zhuǎn)
- (BOOL)shouldAutorotate {
    return [self.visibleViewController shouldAutorotate];
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return [self.visibleViewController supportedInterfaceOrientations];
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentatio {
    return [self.visibleViewController preferredInterfaceOrientationForPresentation];
}
  • 和在 UITabBarController 里面實現(xiàn)
// 是支持屏幕旋轉(zhuǎn)
- (BOOL)shouldAutorotate {
    return [self.selectedViewController shouldAutorotate];
}

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

2、 但是這回出現(xiàn)的問題是庙睡,比如我直接跳轉(zhuǎn)倒膜個頁面事富,需要將當(dāng)前的豎屏變?yōu)闄M屏技俐,直接用上面的方法是行不通的。所以需要使用到 強(qiáng)制橫豎屏统台。在強(qiáng)制很豎屏前必須要明確當(dāng)前設(shè)備到底支持那些方向雕擂,然后才能讓你的設(shè)備支持具體的方向。這些方法寫在 viewDidLoad 里面沒有贱勃,一般寫在viewWillAppear:里面

// 強(qiáng)制旋轉(zhuǎn)屏幕到所需要的方向
- (void)resetInterfaceOrientation:(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];
    }
}
//強(qiáng)制旋轉(zhuǎn)屏幕方向
- (void)resetInterfaceOrientation:(UIInterfaceOrientation)Orientation {
    //
    NSNumber *orientationUnknown = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];
    [[UIDevice currentDevice] setValue:orientationUnknown forKey:@"orientation"];
    //
    NSNumber *orientationTarget = [NSNumber numberWithInt:Orientation];
    [[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
}

3井赌、 其他問題比如點(diǎn)擊某個按鈕,或者觸發(fā)某個事件后需要強(qiáng)制旋轉(zhuǎn)屏幕贵扰,同理也需要先去確定設(shè)備所支持的方向仇穗。這樣才可以相應(yīng)設(shè)備的當(dāng)前方向。

  // (1)橫屏方法戚绕,先確定所需要支持的方向
 self.supportLandscape = YES;
        // 只支旋轉(zhuǎn)
        - (BOOL)shouldAutorotate {
                return YES;
        }
    //  (2)然后在確定支持的方向
        - (UIInterfaceOrientationMask)supportedInterfaceOrientations
        {
            if (self.supportLandscape) {
                return UIInterfaceOrientationMaskLandscape; //左右方向
            } else {
                return UIInterfaceOrientationMaskPortrait;  //豎直方向
            }
    }
    //(3)最后 強(qiáng)制旋轉(zhuǎn)屏幕到所需要的方向
    - (void)resetInterfaceOrientation:(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;
            [invocation setArgument:&val atIndex:2];
            [invocation invoke];
       }
}

4纹坐、還可以通過切換window的rootViewController 來實現(xiàn)橫豎屏,用此次方法來實現(xiàn)橫豎屏是不需要官切換前后的設(shè)備放下過是不是需要還原舞丛。這種方法需要在切換rootViewController之前講原來的rootViewController存儲起來耘子,以保證還原的時候可以還原原來的家控制器。

// 切換rootViewControler
            ZHHorzonViewController *horVC = [[ZHHorzonViewController alloc] init];
            horVC.rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
            [UIApplication sharedApplication].keyWindow.rootViewController = horVC;
//還原rootVC
[UIApplication sharedApplication].keyWindow.rootViewController = self.rootVC;

5球切、 和全局控制谷誓,全局控制是通過 appdelegate 來實現(xiàn)的,向什么有 UINavigationController 和 UITabBarController 等的控制器一樣的處理

  • 先為 appdelegate 注冊屬性用于確定方向
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (self.allowRotation == YES) {
        //橫屏
        return UIInterfaceOrientationMaskLandscape;
    }else{
        //豎屏
        return UIInterfaceOrientationMaskPortrait;
    }
}
  • 然后在需要切換的地方先設(shè)置全局方向
// 全局控制
            AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
            delegate.allowRotation = YES;
  • 最后在改變方向
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 = UIInterfaceOrientationLandscapeLeft;
        // 從2開始是因為0 1 兩個參數(shù)已經(jīng)被selector和target占用
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
  • 當(dāng)還原的時候吨凑,需要先控制支持的方向
// 全局控制
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    delegate.allowRotation = NO;

    // 還原為豎屏
    NSNumber *orientationUnknown = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];
    [[UIDevice currentDevice] setValue:orientationUnknown forKey:@"orientation"];
    NSNumber *orientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捍歪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸵钝,更是在濱河造成了極大的恐慌糙臼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒋伦,死亡現(xiàn)場離奇詭異弓摘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痕届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門韧献,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人研叫,你說我怎么就攤上這事锤窑。” “怎么了嚷炉?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵渊啰,是天一觀的道長。 經(jīng)常有香客問我,道長绘证,這世上最難降的妖魔是什么隧膏? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮嚷那,結(jié)果婚禮上胞枕,老公的妹妹穿的比我還像新娘。我一直安慰自己魏宽,他們只是感情好腐泻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著队询,像睡著了一般派桩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚌斩,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天铆惑,我揣著相機(jī)與錄音,去河邊找鬼凳寺。 笑死鸭津,一個胖子當(dāng)著我的面吹牛彤侍,可吹牛的內(nèi)容都是我干的肠缨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼盏阶,長吁一口氣:“原來是場噩夢啊……” “哼晒奕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起名斟,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤脑慧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砰盐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闷袒,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年岩梳,在試婚紗的時候發(fā)現(xiàn)自己被綠了囊骤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡冀值,死狀恐怖也物,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情列疗,我是刑警寧澤滑蚯,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響告材,放射性物質(zhì)發(fā)生泄漏坤次。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一斥赋、第九天 我趴在偏房一處隱蔽的房頂上張望浙踢。 院中可真熱鬧,春花似錦灿渴、人聲如沸洛波。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹬挤。三九已至,卻和暖如春棘幸,著一層夾襖步出監(jiān)牢的瞬間焰扳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工误续, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吨悍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓蹋嵌,卻偏偏與公主長得像育瓜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栽烂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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