代碼控制App中控制器視圖的橫豎屏切換

第一步: 要想App能夠支持多個方向, 需要在創(chuàng)建工程時設(shè)置支持的方向: 在General-->Deployment Info-->Device Orientation中進行設(shè)置

方向

第二步: 實現(xiàn)上面的設(shè)置, 下面需要通過相應(yīng)的方法來設(shè)置是否支持旋轉(zhuǎn) + 旋轉(zhuǎn)方向等問題.
主要方法如下:

#1. 是否自動旋轉(zhuǎn),返回YES可以自動旋轉(zhuǎn) (假如該方法返回的是NO, 那么你再做什么設(shè)置, 工程中都不會有自動旋轉(zhuǎn)屏幕的效果了)
- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED; 

#2. 返回支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations; 

#3. 這個是返回優(yōu)先支持的方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;```

*如果設(shè)置的當前頁面, 是App的根視圖控制器, 那么實現(xiàn)以上兩個步驟就能完成自動旋轉(zhuǎn)了, 上面的主要方法也都是UIViewController中的實例方法. 

***
你會發(fā)現(xiàn), 只有App啟動時出現(xiàn)的第一個界面(根視圖)內(nèi)重寫上面的方法, 會有效果. 而在其他的界面重寫之后并沒有實現(xiàn)我們想要的翻轉(zhuǎn). (* 由此證明, 這些設(shè)置必須是影響了根視圖中的設(shè)置, 才會有效果. 所以如果想讓根視圖以外的視圖也支持旋轉(zhuǎn), 需要告訴視圖, 在視圖中修改響應(yīng)的設(shè)置)

##例1. 當前controller是根視圖控制器
那么很簡單, 我們直接在當前Controller中重寫上面的兩個方法即可: 

1. 支持自動旋轉(zhuǎn)

  • (BOOL)shouldAutorotate{
    return YES;
    }

2. 值傳的旋轉(zhuǎn)方向

  • (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    //支持除了倒置的所有方向
    return UIInterfaceOrientationMaskAllButUpsideDown;
    }```

例2. App的根視圖控制器是UINavigationController

這是開發(fā)中很常用的, 那么下面介紹怎樣在navigationController中做控制:

第一種方法:

這種方式, 主要用在當push到某個視圖控制器時, 要求該視圖: 支持自動旋轉(zhuǎn)或者強制旋轉(zhuǎn)為橫屏.

# 下面的方法實現(xiàn)過程中, 主要用到的是navigationController中的viewControllers屬性, 這是一個數(shù)組, 數(shù)組的最后一個元素就是最后push到的controller.
-(BOOL)shouldAutorotate { 
return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

 - (UIInterfaceOrientationMask)supportedInterfaceOrientations { 
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
 } 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; 
}

下面在最后push到的controller中調(diào)用上面三個方法

-(BOOL)shouldAutorotate{
 return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations{ 
return UIInterfaceOrientationMaskPortraitUpsideDown;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
return UIInterfaceOrientationPortraitUpsideDown;
}```
其實這樣也就是告訴跟視圖控制器,這個界面我要特殊設(shè)置一下

#####第二種方法:
這種方法是對特定的控制器進行設(shè). 例如我需要只設(shè)定firstVC為支持橫屏, 只需要修改navigationController中的代碼: 

-(BOOL)shouldAutorotate{
//判斷子控制器是不是firstVC
if ([[self.viewControllers lastObject]isKindOfClass:[FirstViewController class]]) {
//如果是則返回Yes
return YES;
}
//如果是其他視圖控制器, 則返回No
return NO;
}

  • (UIInterfaceOrientationMask)supportedInterfaceOrientations{

    if ([[self.viewControllers lastObject]isKindOfClass:[FirstViewController class]]) {
    //支持向左翻轉(zhuǎn)
    return UIInterfaceOrientationMaskLandscapeLeft;
    }
    //僅支持豎屏
    return UIInterfaceOrientationMaskPortrait;
    }

  • (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {

    if ([[self.viewControllers lastObject]isKindOfClass:[FirstViewController class]]) {
    return UIInterfaceOrientationLandscapeLeft;
    }
    return UIInterfaceOrientationPortrait;
    }```
    這樣的好處是: 可以控制指定的控制器, 也不用在指定的控制器內(nèi)重寫上面的方法. 但如果需要自動翻轉(zhuǎn)的視圖比較多的話, 判斷比較麻煩

例3: 根視圖控制器是UITabBarController

首先,設(shè)置一個全局的BOOL值,用于接收通知發(fā)送的參數(shù):

#import <UIKit/UIKit.h>
@interface BaseTabBar : UITabBarController{ 
BOOL shouldAutorotate; 
}
@end

然后注冊一個通知:

//注冊旋轉(zhuǎn)屏幕的通知
 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(autorotateInterface:) name:@"InterfaceOrientationNotification" object:nil];

實現(xiàn)通知方法:

-(void)autorotateInterface:(NSNotification *)notifition{ 
shouldAutorotate = [notifition.object boolValue];
}

然后在重寫的方法里加入判斷:

-(BOOL)shouldAutorotate {
  if (!shouldAutorotate) {
     return NO; 
  }
  else{
     return YES; 
  } 
}

-(UIInterfaceOrientationMask)supportedInterfaceOrientations {
   if (!shouldAutorotate) { 
    return UIInterfaceOrientationMaskPortrait;
   } 
  return UIInterfaceOrientationMaskAllButUpsideDown;
 }

這里我直接將支持的方向?qū)懰懒?只是判斷了一下是否支持自動旋轉(zhuǎn)屏幕,如果需要將支持的方向傳過來,可以修改通知攜帶的參數(shù);
最后在需要自動轉(zhuǎn)屏的控制器內(nèi)發(fā)送通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"InterfaceOrientationNotification" object:@"YES"];```
ending ......

#強制轉(zhuǎn)換:
強制旋轉(zhuǎn)屏幕的方法,可以在進入某個視圖時,強制轉(zhuǎn)成需要的屏幕方向,用的比較多的是在一個豎屏的應(yīng)用中強制轉(zhuǎn)換某一個界面為橫屏(例如播放視頻):
  • (void)orientationToPortrait:(UIInterfaceOrientation)orientation {

    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];//前兩個參數(shù)已被target和selector占用 [invocation invoke];

}```
使用的時候,只需要把你需要旋轉(zhuǎn)的方向傳過去即可!
有一點需要注意:從A進入B的時候,把B強制轉(zhuǎn)換成橫屏,返回的時候,需要在A出現(xiàn)的時候再轉(zhuǎn)換為原來的方向,不然會有問題;個人建議可以在B的viewWillAppear調(diào)用這個方法,轉(zhuǎn)換屏幕(例如轉(zhuǎn)換為橫屏),然后在A的viewWillAppear中轉(zhuǎn)換回來;

文/流火緋瞳(簡書作者)
原文鏈接:http://www.reibang.com/p/650ba0ff626b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末们妥,一起剝皮案震驚了整個濱河市锻全,隨后出現(xiàn)的幾起案子柬采,更是在濱河造成了極大的恐慌程梦,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件借宵,死亡現(xiàn)場離奇詭異幌衣,居然都是意外死亡,警方通過查閱死者的電腦和手機暇务,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怔软,“玉大人垦细,你說我怎么就攤上這事〉脖疲” “怎么了括改?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長家坎。 經(jīng)常有香客問我嘱能,道長吝梅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任惹骂,我火速辦了婚禮苏携,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘对粪。我一直安慰自己右冻,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布著拭。 她就那樣靜靜地躺著纱扭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儡遮。 梳的紋絲不亂的頭發(fā)上乳蛾,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音鄙币,去河邊找鬼肃叶。 笑死,一個胖子當著我的面吹牛爱榔,可吹牛的內(nèi)容都是我干的被环。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼详幽,長吁一口氣:“原來是場噩夢啊……” “哼筛欢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唇聘,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤版姑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迟郎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剥险,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年宪肖,在試婚紗的時候發(fā)現(xiàn)自己被綠了表制。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡控乾,死狀恐怖么介,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜕衡,我是刑警寧澤壤短,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響久脯,放射性物質(zhì)發(fā)生泄漏纳胧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一帘撰、第九天 我趴在偏房一處隱蔽的房頂上張望跑慕。 院中可真熱鬧,春花似錦骡和、人聲如沸相赁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钮科。三九已至,卻和暖如春婆赠,著一層夾襖步出監(jiān)牢的瞬間绵脯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工休里, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛆挫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓妙黍,卻偏偏與公主長得像悴侵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拭嫁,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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