这篇文章主要介绍了iOS app开发中控制屏幕旋转的方法总结,分为自动旋转和手动旋转以及强制旋转三种情况,代码为Objective-C语言,需要的朋友可以参考下。
在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewController支持旋转,只需要重写shouldAutorotateToInterfaceOrientation方法。
但是iOS 6里屏幕旋转改变了很多,之前的 shouldAutorotateToInterfaceOrientation 被列为 DEPRECATED 方法,查看UIViewController.h文件也可以看到:
<span style="font-size:14px;">// Applications should use supportedInterfaceOrientations and/or shouldAutorotate.. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation NS_DEPRECATED_IOS(2_0, 6_0); </span>
<span style="font-size:14px;">- (BOOL)shouldAutorotate; - (NSUInteger)supportedInterfaceOrientations; </span>
1.
2.
自动旋转设置:
控制某个viewController旋转并不是像IOS5或者IOS4一样在这个viewController里面重写上面那2个方法,而是需要在这个viewController的rootViewController(根视图控制器)里面重写,怎么解释呢?就是最前面的那个viewController,直接跟self.window接触的那个controller,比如以下代码:
<span style="font-size:14px;">UIViewController *viewCtrl = [[UIViewController alloc] init]; UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:viewCtrl]; if ([window respondsToSelector:@selector(setRootViewController:)]) { self.window.rootViewController = navCtrl; } else { [self.window addSubview:navCtrl.view]; } </span>
<span style="font-size:14px;">-(NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskAllButUpsideDown; } - (BOOL)shouldAutorotate{ return YES; } </span>
eg2:如果viewCtrl又pushViewController到viewCtrl2,需要设置viewCtrl2的旋转,怎么办呢? 还是在navCtrl里面控制,因为viewCtrl和viewCtrl2的rootViewController都是navCtrl,一般的写法都是
<span style="font-size:14px;">UIViewController *viewCtrl2 = [[UIVewController alloc] init]; [self.navigationController.navigationController pushViewController:viewCtrl2 animated:YES]; </span>
但是有时候我初始化UINavigationController的时候,并不知道所有我所有需要push到的viewController,那么这里有一个通用的方法,就是让viewController自己来控制自己,首先在navCtrl里面的实现方法改为以下方式:
<span style="font-size:14px;">- (BOOL)shouldAutorotate { return self.topViewController.shouldAutorotate; } - (NSUInteger)supportedInterfaceOrientations { return self.topViewController.supportedInterfaceOrientations; } </span>
eg3:如果viewCtrl 是 presentModalViewController 到 viewCtrl3,那么viewCtrl3的旋转设置就不在navCtrl里面了!如果presentModalViewController的viewController是navController、tabbarController包装过的viewCtrl3,那么就应在新包装的navController、tabbarController里面设置,如果是直接presentModalViewController到viewCtrl3,那么就在viewCtrl3里面设置。
<span style="font-size:14px;">if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) { [[UIDevice currentDevice] performSelector:@selector(setOrientation:) withObject:(id)UIInterfaceOrientationPortrait]; }</span>
<span style="font-size:14px;">self.view.transform = CGAffineTransformMakeRotation(M_PI/2) </span>
那既然是旋转,最少也得有2个方向,那么还是少不了上面说的那个硬性条件,先在plist里面设置好所有可能需要旋转的方向。既然是手动旋转,那么就要关闭自动旋转:
<span style="font-size:14px;">- (BOOL)shouldAutorotate{ return NO; }</span>
<span style="font-size:14px;">[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; self.view.transform = CGAffineTransformMakeRotation(M_PI/2); self.view.bounds = CGRectMake(0, 0, kScreenHeight, 320); </span>
强制旋转屏幕
最近接手了一个项目,正常情况下使用查看图片是没问题的。
用到了 MWPhotoBrowser 这个第三方图片浏览库。
不过发现了一个问题,就是设备横屏modal这MWPhotoBrowser的时候,发生了图片位置错乱。
实在没办法,所以想到了一个馊主意。
就是modal的时候使用代码把设备强制旋转回去。
<span style="font-size:14px;">//UIDevice+WJ.h @interface UIDevice (WJ) /** * 强制旋转设备 * @param 旋转方向 */ + (void)setOrientation:(UIInterfaceOrientation)orientation; @end //UIDevice+WJ.m #import "UIDevice+WJ.h" @implementation UIDevice (WJ) //调用私有方法实现 + (void)setOrientation:(UIInterfaceOrientation)orientation { SEL selector = NSSelectorFromString(@"setOrientation:"); NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self instanceMethodSignatureForSelector:selector]]; [invocation setSelector:selector]; [invocation setTarget:[self currentDevice]]; int val = orientation; [invocation setArgument:&val atIndex:2]; [invocation invoke]; } @end</span>