项目仅支持竖屏,特定页面支持横屏(二)
方法很简单:
第一步:监听屏幕是否翻转的通知
[[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];
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
[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;
returnself.allowMaskAllOrientations ? UIInterfaceOrientationMaskAll : UIInterfaceOrientationMaskPortrait;
}
完成。
很快吧,好像对其他控制器没有过特殊设置,而且不用实例化个导航控制器,节省了太多空间了。
上一种方法是我结合多种外援的产品,比较麻烦,要将每一个控制器都写上两个方法,是否支持方向旋转和支持哪种旋转方向。不过我一直在考虑,可能写一个控制器的类,这个类里边写清不支持横屏的两个方法,然后让每个控制器都去继承这个控制器,在此基础上再写其他的方法实现。但是我并没有实际验证。而支持横屏的页面就正常去创建控制器,然后在控制器中写好那两个方法。
期初,上一种方法是有问题的,但是最近又没有复现问题,源于记忆,好像是状态栏会自由的横竖切换,主要是在不支持横屏的页面,我并没有找到原因,也不知道是怎么才可固定在顶部。不过这个问题真的不再复现了,我做了几次尝试都没有了。
今天这种是有问题的,一个是横屏后,点击屏幕没有变化了,导航栏由于人工的隐藏,仅可再次竖屏后,才能返回上一页。另一个,如果人为的不去把导航栏隐藏掉的话,导航栏会有问题,又美观具体我就不复现了。
那么第二种是简单的,工程中不用勾选向左横屏和向右横屏,每个控制器也都不用再设置那两个方法了,仅在播放的控制器中写就可以了。
我也将第一种方法的实现连接附上:http://www.cnblogs.com/guoqiangx-5/p/5501008.html
本文原创,转载请附原文链接,谢谢。