当iphone的某一方向(一般是竖屏)锁定没有开启的时候,当手机横放后,没有写死程序支持方向的程序或者支持横屏的程序都会翻转
以上是废话
但是当竖屏锁定开启的时候,某一时刻当程序需要强制横屏展示的时候,就比较难受了,这个坑我开始做的时候百度到了一堆不知所云的答案,在爬了数不清的文档之后差不多摸清楚了里面的坑了
首先是Target里的General里有Deviece Orientation的设置,这里一般默认是选中Portrait的,既默认竖屏
要注意的是这个设置的是全局的方向,如果只是部分页面需要改变方向的话其实这个地方完全可以不用设置,我们只要在对应的controller里通过代码来设置
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
不过这里设置的东西当竖屏锁定开启之后就没什么用了,为了解决程序强制横屏问题可以有下面两个思路
第一,一个navigation推出来的controller是一定和这个导航一个方向的,这样我们就可以做一个横向的navigation,用这个navigation来push我们想要横屏的controller,这样就很轻松的实现了某一页面横屏的要求,并且这种方法的好处是不会和弹出的键盘冲突,没有那些莫名其妙的bug,缺点就是生成新的navigation的时候动画需要自己来写,生成的navigation里的和方向有关方法只重要写下面三个就可以了
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight );
}
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
- (BOOL)shouldAutorotate
{
return YES;
}
之后就用自己生成的navigation弹出controller就可以了,代码如下
ZCNavigationController *nav = [[ZCNavigationController alloc]init];
nav.navigationBarHidden = YES;
[nav addChildViewController:web];
[self presentViewController:nav animated:YES completion:nil];
第二种思路就是强制让设备转向,,由竖屏锁定变成横屏锁定,这个缺点就是貌似会导致闪退(反正我没有遇到)以及输入法bug
首先就是要在appdelegate里重写下面的方法
- (UIInterfaceOrientationMask )application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if (allowRotation == 1) {
return UIInterfaceOrientationMaskLandscape;
}
else
{
return (UIInterfaceOrientationMaskPortrait);
}
}
allowRotation是自己定义的一个变量,用来判断是要横屏还是竖屏用的,接下来在要横屏的页面里加入以下代码
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
appDelegate.allowRotation = 1;
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];//这句话是防止手动先把设备置为横屏,导致下面的语句失效.
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
一般我会写到viewwillappear里面,同理,在viewwilldisappear方法里将屏幕回正
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
appDelegate.allowRotation = 0;
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];//这句话是防止手动先把设备置为竖屏,导致下面的语句失效.
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];
这里将我暂时遇到的坑说一下
ios9以上要加上如下代码,否则你会发现你弹出的输入键盘根本不旋转
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0){ if ([self.mytext isFirstResponder]) { [self.mytext resignFirstResponder]; } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"进来啦"); [self.mytext becomeFirstResponder]; }); }
当然你也可以先取消键盘的响应,等转向完成后再弹出键盘一样也是可以的