iOS豎屏App強(qiáng)制某一部分橫屏

前言

很長(zhǎng)時(shí)間沒(méi)有更新簡(jiǎn)書椭符,原因不多說(shuō)(因?yàn)閼校罱容^清閑贪绘,想起來(lái)寫一篇文章來(lái)說(shuō)一下iOS橫豎屏輕松切換的過(guò)程徘键。 有些需求整體的App只支持豎屏练对,但是只需要某一部分頁(yè)面支持橫屏,許多的視頻類的App都要在豎屏的情況下進(jìn)行橫屏播放啊鸭,當(dāng)然還有很多的奇葩需求要橫屏來(lái)進(jìn)行實(shí)現(xiàn)锹淌。

廢話少說(shuō),進(jìn)主題

創(chuàng)建項(xiàng)目赠制,App的方向只需要勾選Portrait就行(其實(shí)可以不用勾赂摆,但是能有幾個(gè)項(xiàng)目中不勾的呢,我們還是勾上吧)钟些。

勾選方向

前面說(shuō)可以不勾選因?yàn)槲覀円贏ppDelegate中烟号,重寫這個(gè)方法, 應(yīng)用程序啟動(dòng)的時(shí)候會(huì)調(diào)用這個(gè)方法來(lái)給App所需要的屏幕方向:

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if([ScreenDirectionManager manager].islandscape) {
        return UIInterfaceOrientationMaskLandscape;
    }else {
        return UIInterfaceOrientationMaskAll;
    }
    
}

其中UIInterfaceOrientationMask是一個(gè)NS_OPTIONS政恍, 我們可以隨意組合汪拥,雖然其中有一些組合好的,但是萬(wàn)一不滿足產(chǎn)品的奇葩需求呢篙耗,對(duì)不對(duì)迫筑,要提前留一手。

typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
    UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
    UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
    UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
    UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
    UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
    UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
    UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
} __TVOS_PROHIBITED;

意思內(nèi)容不用多解釋宗弯,應(yīng)該都能知道什么意思脯燃。

其中ScreenDirectionManager這個(gè)類控制屏幕是否橫屏,是一個(gè)單例就一個(gè)屬性是否需要橫屏蒙保,比較簡(jiǎn)單辕棚。

@interface ScreenDirectionManager : NSObject

+ (instancetype)manager;

@property (nonatomic, assign, getter=islandscape) BOOL landscape;

@end

如果你的App不包括導(dǎo)航欄(UINaviagtionController)或者(UITabbarController),你只需要重寫UIViewController里面的三個(gè)方法就行邓厕,這三個(gè)方法是:

//  返回bool值逝嚎,決定Controller是否自動(dòng)旋轉(zhuǎn)
-(BOOL)shouldAutorotate
//返回一個(gè)Controller支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
//返回現(xiàn)在正在顯示的用戶界面方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

但是一般的應(yīng)用至少有個(gè)導(dǎo)航欄吧,所以呢你還需要自定義導(dǎo)航欄(UINavigationController)详恼,然后在導(dǎo)航欄里面重寫這三個(gè)方法补君,如果不重寫,就無(wú)法達(dá)到你想要的效果昧互,感覺(jué)就像這個(gè)屏幕方向具有傳遞的性質(zhì)赚哗。但是我感覺(jué)UITabbarController的情況應(yīng)該少數(shù)她紫,我這里不討論這個(gè)情況,下次有空再補(bǔ)上屿储,但是我感覺(jué)原理應(yīng)該是一樣的,有興趣的可以自己試一下渐逃。

導(dǎo)航欄的屏幕方向和旋轉(zhuǎn)性質(zhì)要和導(dǎo)航欄最上層的Controller保持一致够掠,所以自定義導(dǎo)航欄重寫的三個(gè)方法是這樣的:

-(BOOL)shouldAutorotate {
    return [[self.viewControllers lastObject] shouldAutorotate];
}

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

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

ViewController中,重寫上述的三個(gè)方法茄菊,返回自己想要的方向疯潭,那個(gè)改Controller只能是返回的方向,例如:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

- (BOOL)shouldAutorotate {
    return YES;
}

在第二個(gè)頁(yè)面中面殖,也就是跳轉(zhuǎn)的頁(yè)面中竖哩,重寫上述的三個(gè)方法,返回自己想要的方向脊僚,然后在viewWillAppear方法中設(shè)定將單例的屬性方向改變相叁,然后根據(jù)UIDeviceorientation這個(gè)屬性,根據(jù)KVC辽幌,強(qiáng)制設(shè)置方向增淹,如下;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [ScreenDirectionManager manager].landscape = YES;
    if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
//寫這句話的目的是保證后面的一句話產(chǎn)生作用,具體不明白為什么乌企,但是不加上會(huì)出現(xiàn)bug虑润。有明白的可以告知一下。
        [[UIDevice currentDevice] setValue:@(UIDeviceOrientationUnknown) forKey:@"orientation"];
        [[UIDevice currentDevice] setValue:@(UIDeviceOrientationLandscapeLeft) forKey:@"orientation"];
    }
    
}

還需要在viewWillDisappear中加酵,將單例的橫豎屏屬性改變回來(lái)拳喻,因?yàn)?strong>supportedInterfaceOrientations這個(gè)方法會(huì)觸發(fā)AppDelegate中的方向支持方法。

結(jié)論

文章描述的不太清楚的猪腕,歡迎留言討論冗澈。Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市码撰,隨后出現(xiàn)的幾起案子渗柿,更是在濱河造成了極大的恐慌,老刑警劉巖脖岛,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朵栖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柴梆,警方通過(guò)查閱死者的電腦和手機(jī)陨溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绍在,“玉大人门扇,你說(shuō)我怎么就攤上這事雹有。” “怎么了臼寄?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵霸奕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吉拳,道長(zhǎng)质帅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任留攒,我火速辦了婚禮煤惩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炼邀。我一直安慰自己魄揉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布拭宁。 她就那樣靜靜地躺著洛退,像睡著了一般。 火紅的嫁衣襯著肌膚如雪红淡。 梳的紋絲不亂的頭發(fā)上不狮,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音在旱,去河邊找鬼摇零。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桶蝎,可吹牛的內(nèi)容都是我干的驻仅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼登渣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼噪服!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起胜茧,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粘优,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后呻顽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雹顺,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年廊遍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嬉愧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喉前,死狀恐怖没酣,靈堂內(nèi)的尸體忽然破棺而出王财,到底是詐尸還是另有隱情,我是刑警寧澤裕便,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布绒净,位于F島的核電站,受9級(jí)特大地震影響闪金,放射性物質(zhì)發(fā)生泄漏疯溺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一哎垦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恃疯,春花似錦漏设、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至盾鳞,卻和暖如春犬性,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腾仅。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工乒裆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人推励。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓鹤耍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親验辞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稿黄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 很多時(shí)候,項(xiàng)目中都有這樣的需求:APP中以豎屏為主,個(gè)別界面會(huì)要求橫屏顯示,或者要根據(jù)用戶的手機(jī)朝向自動(dòng)切換橫豎屏...
    流火緋瞳閱讀 22,141評(píng)論 50 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件跌造、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • 經(jīng)過(guò)十年的工作經(jīng)歷杆怕,隨著面臨的工作越來(lái)越難,接觸的面越來(lái)越廣壳贪,接觸的人越來(lái)越多陵珍,越發(fā)覺(jué)得自己的知識(shí)匱乏,難以勝任現(xiàn)...
    0ac91607e589閱讀 217評(píng)論 0 0
  • #羨慕別人的光環(huán)# 是的撑碴,光環(huán)很顯眼撑教,容易吸引注意,所以醉拓,我們很快看到了別人的光環(huán)伟姐,然后收苏,心生羨慕之情,然后就沒(méi)然...
    Ningers閱讀 151評(píng)論 0 0