iOS 橫豎屏切換

本文只針對單個界面橫豎屏界面

1.首先在TARGETS中將橫豎屏勾選上(不用勾選貌似也可以,只不過需要在AppDelegate中,代碼控制)

image.png

AppDelegate中控制橫豎屏的代碼如下

- (UIInterfaceOrientationMask )application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    //如果設置了allowRotation屬性,支持全屏
    if (self.allowRotation) {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    return UIInterfaceOrientationMaskPortrait;//默認全局不支持橫屏
}

2.主要利用通知來實現,AppDelegate中創建BOOL值allowRotation

- (void)addNotificationCenter
{
    //在進入需要全屏的界面里面發送需要全屏的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startFullScreen) name:@"startFullScreen" object:nil];//進入全屏
    //在退出需要全屏的界面里面發送退出全屏的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endFullScreen) name:@"endFullScreen" object:nil];//退出全屏
}
#pragma mark 進入全屏
-(void)startFullScreen
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.allowRotation = YES;
}
#pragma mark    退出橫屏
-(void)endFullScreen
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.allowRotation = NO;
    //強制歸正:
    [[AnyeToolManager shareManager] setOrientationInterfaceOrientationPortrait];
}
#pragma mark    禁止橫屏
- (UIInterfaceOrientationMask )application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    //如果設置了allowRotation屬性,支持全屏
    if (self.allowRotation) {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    return UIInterfaceOrientationMaskPortrait;//默認全局不支持橫屏
}

強制歸正的代碼:
1.第一種,據說調用私有變量,可能被拒

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];
    }

2.第二種,利用KVO,目前采用此方法,會不會被拒尚未知,等項目上線后回來更新(項目已上線,用此種方法可以通過審核)

    NSNumber *orientationUnknown = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];
    [[UIDevice currentDevice] setValue:orientationUnknown forKey:@"orientation"];
    
    NSNumber *orientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];

其實后兩行代碼就可以滿足需求,至于前兩行代碼的原因,這里有答案http://www.lxweimin.com/p/6c45fa2bb970

3.在需要橫屏的控制器的viewWillAppear和viewWillDisappear中分別發送可以橫屏和取消橫屏的通知

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];    
    //發送全屏通知
    [[NSNotificationCenter defaultCenter] postNotificationName:@"startFullScreen" object:nil];
    //強制歸正
    [[AnyeToolManager shareManager] setOrientationInterfaceOrientationPortrait];
}
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    //發送非全屏通知
    [[NSNotificationCenter defaultCenter] postNotificationName:@"endFullScreen" object:nil];
}

4.搞定,不過有BUG,在橫屏模式下,退出到不可以橫屏的控制器,會默認先回正,再pop,視覺上不是很好,這個問題正在研究...

5.另外,在我處理橫豎屏切換的過程中,遇到一個問題,切換動畫消失,也就是,豎屏到橫屏的過程很突然,沒有旋轉的過程,也算是一個奇葩.經過大量的谷歌百度,竟然搜不到任何相關,好在最后意外解決,也算是驚喜,方法如下

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [UIView beginAnimations:@"rotate" context:nil];
    [UIView setAnimationDuration:ReadAnimationLeftRightTimeInterval];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [UIView commitAnimations];//一定要停止,不停止的話,整個APP的所有的動畫都會出異常
    });
    
}

viewWillTransitionToSize:(CGSize)size withTransitionCoordinator方法會在橫豎屏切換的時候調用,在這個方法中讓UIView的rotate動畫beginAnimation,并且切記要執行 [UIView commitAnimations],而且此方法千萬不要立即執行,延遲一點時間,不然還是沒動畫,但如果不執行的話,整個APP的所有的動畫都會出異常
其實這種方法也有好處,就是可以調整橫豎屏切換的時間

[UIView setAnimationDuration:ReadAnimationLeftRightTimeInterval];

我這里的ReadAnimationLeftRightTimeInterval只是個宏,可以根據所需調整

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

推薦閱讀更多精彩內容

  • iOS 中橫豎屏切換的功能,在開發iOS app中總能遇到。以前看過幾次,感覺簡單,但是沒有敲過代碼實現,最近又碰...
    零度_不結冰閱讀 2,208評論 0 0
  • 網上關于橫豎屏切換的資料很多,但是很容易踩到坑,不是屏幕不旋轉,就是屏幕旋轉后沒有狀態欄等,在寫的小demo里屏幕...
    凌云01閱讀 549評論 0 0
  • 進入正文前先認識幾個概念 portrait 豎屏(Home鍵在下邊) upside down 豎屏(Home鍵在上...
    hallfrita閱讀 1,457評論 0 2
  • 導航控制器PUSH 需求:當前豎屏下情況下,導航欄直接PUSH出一個橫屏的控制器,并在POP后返回豎屏狀態。效果圖...
    毅個天亮閱讀 979評論 0 1
  • 在網上找iOS橫屏相關的信息時發現只有進入頁面強制橫屏的代碼,并沒有在一個頁面通過點擊按鈕的方式實現當前屏幕的橫豎...
    iOS_Edward閱讀 1,749評論 4 1