方法很簡單:
第一步:監聽屏幕是否翻轉的通知
[[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
第二步:寫監聽後調用的方法(主要目的就是隱藏狀態欄和導航欄)
- (void)deviceOrientationDidChange:(NSNotification *)notif {
UIDeviceOrientation orientation = [UIDevicecurrentDevice].orientation;
BOOL isPortrait = orientation == UIDeviceOrientationPortrait;
[self.navigationControllersetNavigationBarHidden:!isPortrait animated:YES];
[[UIApplicationsharedApplication] setStatusBarHidden:!isPortrait withAnimation:UIStatusBarAnimationFade];
}
第三步:在將要出現的頁面和將要消失的頁面寫清是否容許旋轉,消失的時候把監聽移除
- (void)viewDidAppear:(BOOL)animated {
[superviewDidAppear:animated];
AppDelegate *appdelegate = [UIApplicationsharedApplication].delegate;
appdelegate.allowMaskAllOrientations = YES;
}
- (void)viewWillDisappear:(BOOL)animated {
[superviewWillDisappear:animated];
AppDelegate *appdelegate = [UIApplicationsharedApplication].delegate;
appdelegate.allowMaskAllOrientations = NO;
[[NSNotificationCenterdefaultCenter] removeObserver:self
name:UIDeviceOrientationDidChangeNotification
object:nil];
}
第四步:在AppDelegate.h中補上上邊的那個判斷橫豎屏的布爾值屬性
@property (assign, nonatomic) BOOL allowMaskAllOrientations; // 是否容許旋轉
第五步:在AppDelegate.m中寫上屏幕旋轉控制的方法(6.0之後纔有的方法,如今都用8.0了)
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
returnself.allowMaskAllOrientations ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationMaskPortrait;
}
完成。
很快吧,好像對其餘控制器沒有過特殊設置,並且不用實例化個導航控制器,節省了太多空間了。
上一種方法是我結合多種外援的產品,比較麻煩,要將每個控制器都寫上兩個方法,是否支持方向旋轉和支持哪一種旋轉方向。不過我一直在考慮,可能寫一個控制器的類,這個類裏邊寫清不支持橫屏的兩個方法,而後讓每一個控制器都去繼承這個控制器,在此基礎上再寫其餘的方法實現。可是我並無實際驗證。而支持橫屏的頁面就正常去建立控制器,而後在控制器中寫好那兩個方法。
期初,上一種方法是有問題的,可是最近又沒有復現問題,源於記憶,好像是狀態欄會自由的橫豎切換,主要是在不支持橫屏的頁面,我並無找到緣由,也不知道是怎麼纔可固定在頂部。不過這個問題真的再也不復現了,我作了幾回嘗試都沒有了。
今天這種是有問題的,一個是橫屏後,點擊屏幕沒有變化了,導航欄因爲人工的隱藏,僅可再次豎屏後,才能返回上一頁。另外一個,若是人爲的不去把導航欄隱藏掉的話,導航欄會有問題,又美觀具體我就不復現了。
那麼第二種是簡單的,工程中不用勾選向左橫屏和向右橫屏,每一個控制器也都不用再設置那兩個方法了,僅在播放的控制器中寫就能夠了。
本文原創,轉載請附原文連接,謝謝。