屏幕橫豎屏旋轉(zhuǎn)系統(tǒng)整理

之前項目中有個關(guān)于橫豎屏的需求叶撒,原本以為是很簡單的事情紊搪,隨便一些就能解決卡儒,但結(jié)果發(fā)現(xiàn)事實并不是這樣田柔。網(wǎng)上也搜索了很多關(guān)于橫豎屏旋轉(zhuǎn)的資料俐巴,但是很難發(fā)現(xiàn)卻不能滿足當(dāng)時項目中的需求,因為網(wǎng)上給的實現(xiàn)很多都是針對一個小demo而言硬爆,只是兩個簡單的ViewController欣舵。而實際項目中一般都會涉及tabBarControll、navigationController摆屯,網(wǎng)上很多資料給的并不是很完全邻遏。所以就決定給這塊知識好好補充一下,記得當(dāng)時研究屏幕旋轉(zhuǎn)主要是參考ZFPlayer虐骑。實際屏幕旋轉(zhuǎn)會因為項目結(jié)構(gòu)准验,present,push等不同因素影響廷没。今天就分多鐘情況說明一下屏幕旋轉(zhuǎn)的實現(xiàn)糊饱,并附帶上源碼下載地址。https://github.com/ZhengYaWei1992/ScreenRotate

======================第一種情況======================
常規(guī)帶有tabbarController的結(jié)構(gòu)颠黎,首頁面都不能旋轉(zhuǎn)另锋,只有在某一個present進去的子頁面可以旋轉(zhuǎn),注意這里是present狭归,不是push夭坪。這兩種情況差別很大的。
首先过椎,要想支持屏幕旋轉(zhuǎn)室梅,必選讓整個項目可以支持屏幕旋轉(zhuǎn),如下圖:

設(shè)置整個項目支持屏幕旋轉(zhuǎn)

a.首先在AppDelegate中添加一個全局屬性疚宇。

@property(nonatomic,assign)UIInterfaceOrientationMask allowRotation;

b.在AppDelegate.m中實現(xiàn)一個這樣一個方法亡鼠。

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (_allowRotation == 1) {
      //支持橫豎屏,注意手機只能支持三個方向敷待,這里不能寫成UIInterfaceOrientationMaskAll间涵,否則會出現(xiàn)一些不可預(yù)料的問題。只有iPad才支持四個方向榜揖。
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else
    {
        return (UIInterfaceOrientationMaskPortrait);
    }
}

c.在present進去的子頁面中實現(xiàn)的代碼如下勾哩,設(shè)置支持橫豎屏。
在viewDidLoad:方法中添加如下代碼,設(shè)置屏幕支持旋轉(zhuǎn)举哟。

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    appDelegate.allowRotation = 1;

d.在離開這個界面之前我們要實現(xiàn)下面的代碼思劳,設(shè)置只支持豎屏。

//離開的時候要再次設(shè)置
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    appDelegate.allowRotation = 0;

e.如果想在屏幕旋轉(zhuǎn)后做一些適配炎滞,可以在下面這個方法中實現(xiàn)敢艰。

//在這里布局橫豎屏的UI
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
        self.view.backgroundColor = [UIColor whiteColor];
        NSLog(@"垂直");
    }else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
        self.view.backgroundColor = [UIColor redColor];
        NSLog(@"橫向");
    }
}

======================第二種情況======================
再看第二種情況,和第一種情況基本類似册赛,只是將present方式改成push進入子頁面钠导。雖然只是改變了一點震嫉,但是實現(xiàn)代碼上差別很大的。
a.首先需要在tabbarController中實現(xiàn)以下兩個方法牡属。這兩個方法的意思是將控制屏幕旋轉(zhuǎn)的主動權(quán)都交給每個子頁面去實現(xiàn)票堵。

//是否支持旋轉(zhuǎn)
-(BOOL)shouldAutorotate{
    UINavigationController *navC = self.selectedViewController;
    UIViewController *currentVC = navC.visibleViewController;
    return [currentVC shouldAutorotate];
}
//支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    UINavigationController *navC = self.selectedViewController;
    UIViewController *currentVC = navC.visibleViewController;
    return [currentVC supportedInterfaceOrientations];;
}

b.push進去的子頁面首先要重寫兩個系統(tǒng)方法,即和tabbarViewCotroller中相同的方法逮栅。設(shè)置支持旋轉(zhuǎn)悴势,支持三個旋轉(zhuǎn)方向

/是否可以旋轉(zhuǎn)
- (BOOL)shouldAutorotate
{
    return YES;
}
//支持的方向
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

c.但是僅僅實現(xiàn)上面的代碼是不夠的,這是如果在橫屏狀態(tài)下返回上一界面措伐,會發(fā)現(xiàn)上一界面也是處于橫屏狀態(tài)特纤。這和我們的初衷不一樣,我們想的是上一界面支持豎屏狀態(tài)侥加,不會受到子頁面的影響捧存。解決辦法是在子頁面返回的時候?qū)崿F(xiàn)以下代碼。

//這里的目的是為了使返回時担败,上一界面依然是豎屏
-(void)viewWillDisappear:(BOOL)animated{
    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 = UIInterfaceOrientationPortrait;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
}

d.同樣昔穴,子頁面橫豎屏界面的適配同樣可以在以下這個方法中實現(xiàn)。
//在這里布局橫豎屏的UI
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
self.view.backgroundColor = [UIColor whiteColor];
NSLog(@"垂直");
}else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
self.view.backgroundColor = [UIColor blackColor];
NSLog(@"橫向");
}
}
e.其他不支持橫豎屏切換的控制器提前,都要實現(xiàn)以下方法吗货。

   - (BOOL)shouldAutorotate
  {
      return NO;
  }
  //支持的方向
  -(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

======================第三種情況======================
這一次我們只讓present的子頁面,只支持橫屏狈网,不支持豎屏宙搬。而其他控制器支持豎屏。實現(xiàn)起來很簡單孙援,只是在第一種情況中做一個小小的變動害淤。將第一種情況中的b步驟實現(xiàn)代碼改為如下代碼扇雕,其他實現(xiàn)代碼和第一種情況相同拓售。

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (_allowRotation == 1) {
        NSLog(@"appDelegate橫屏");
        return UIInterfaceOrientationMaskLandscapeRight;
    }
    else
    { NSLog(@"appDelegate豎屏");
        return (UIInterfaceOrientationMaskPortrait);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市镶奉,隨后出現(xiàn)的幾起案子础淤,更是在濱河造成了極大的恐慌,老刑警劉巖哨苛,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸽凶,死亡現(xiàn)場離奇詭異,居然都是意外死亡建峭,警方通過查閱死者的電腦和手機玻侥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亿蒸,“玉大人凑兰,你說我怎么就攤上這事掌桩。” “怎么了姑食?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵波岛,是天一觀的道長。 經(jīng)常有香客問我音半,道長则拷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任曹鸠,我火速辦了婚禮煌茬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彻桃。我一直安慰自己宣旱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布叛薯。 她就那樣靜靜地躺著浑吟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耗溜。 梳的紋絲不亂的頭發(fā)上组力,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音抖拴,去河邊找鬼燎字。 笑死,一個胖子當(dāng)著我的面吹牛阿宅,可吹牛的內(nèi)容都是我干的候衍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼洒放,長吁一口氣:“原來是場噩夢啊……” “哼蛉鹿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起往湿,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤妖异,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后领追,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體他膳,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年绒窑,在試婚紗的時候發(fā)現(xiàn)自己被綠了棕孙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蟀俊,靈堂內(nèi)的尸體忽然破棺而出分歇,到底是詐尸還是另有隱情,我是刑警寧澤欧漱,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布职抡,位于F島的核電站,受9級特大地震影響误甚,放射性物質(zhì)發(fā)生泄漏缚甩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一窑邦、第九天 我趴在偏房一處隱蔽的房頂上張望擅威。 院中可真熱鬧,春花似錦冈钦、人聲如沸郊丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厉熟。三九已至,卻和暖如春较幌,著一層夾襖步出監(jiān)牢的瞬間揍瑟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工乍炉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绢片,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓岛琼,卻偏偏與公主長得像底循,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子槐瑞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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