前两天遇到了一个 “使用指定的不同屏幕方向打开新页面” 的需求,需求很简单:APP 一直保持竖屏,要求新打开的签名页面能够指定为横屏或竖屏,并自动的转换,且不允许自动切换,新页面退出后要恢复竖屏!
在网上查了很多资料均不能获取自己想要的效果,最后整理了别人的思路,方法,再花了一天的工作量填坑,成功实现了想要的功能和效果,嗯,完美!!!!
公司的 APP 采用的通用方案:根控制器为 TabBarController,之后嵌套 NavigationController,然后放入 ViewController 页面进行展示,需要横屏的页面控制器建议需要用 present 方式进行弹出(原因就是坑少啰!!!!)。
废话太多直接进入正题!!!!!!!!
第一步:
在AppDelegate.m中的- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window中添加以下代码
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
BOOL isAllowLandscape = [userDefault boolForKey:@"userDefault_isAllowLandscape"];
[userDefault setBool:NO forKey:@"userDefault_isAllowLandscape"];
//这里其实可以再加一个判断,具体到需要强制横评的页面
if (isAllowLandscape) {
return UIInterfaceOrientationMaskLandscapeRight;
}
else
{
return (UIInterfaceOrientationMaskPortrait);
}
其中采用单例模式进行横竖屏标志tag设置ps:之前查了很多资料,最有效的方法中都在要求在target ->general ->Deployment info -> Device Orientation中勾选Landscape Left 或者****Right,我也试着这么弄了,但是这个有个大坑,他们也没提出自己的解决方案!弄了我半天,毕竟这个设置后整个app都可以进行横竖屏,设置横竖屏标志来强制某些界面可以横评或者竖屏这个方法也用了,某些情况还是会出现bug,总之就一句话:就是有坑。
第二部:
a.直接在需要强制横屏的控制器的ViewDidLoad方法中添加修改单例状态代码
NSLog(@"TradeSignatureViewController:viewDidLoad");
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setBool:YES forKey:@"userDefault_isAllowLandscape"];
b.在viewWillDisAppear中恢复单例状态为竖屏标志,就是为了推出界面后强制回竖屏
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setBool:NO forKey:@"userDefault_isAllowLandscape"];
}
c.
在提取签名的方法中添加如下代码
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setBool:NO forKey:@"userDefault_isAllowLandscape"]; //图片获取到后恢复竖屏,否则会出现返回页面也是横屏的情况
最后的重点: 因为签名界面仅仅允许横屏,因此在进行xib (没有用xib当我没说),因此xib的属性选择Landscape然后进行横屏布局(为了不埋坑,在同一个文件中弹出框最好也做一个横屏的弹出框,这样就需要对全局的弹出框再进行一次横屏切换)
总结:看了好多解决方案,填了好多坑,最后压缩成就这点代码,两天的工作量,真是日了狗!