项目中会遇到一页是横屏,其他保持竖屏的情况
一.在横屏的页面用autoResizing布局:
headerView.frame = CGRectMake(0, 0, ScreenWidth, 64);
[headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
二.总体设置禁止横屏:
有三种方法:a.target- general下面
Snip20161213_2.png
取消选中下面两个,即可禁掉横屏,但本例中不适用,仅作介绍
b.info.plist- open As -source code
Snip20161213_1.png
注释掉就好了
c.appDelegate.m中
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
// 关闭横屏
return UIInterfaceOrientationMaskPortrait;
}
本文介绍的也是基于第三种方法
AppDelegate.h中定义一个记录的属性
@property(nonatomic, assign)BOOL allowRotate;
在AppDelegate.m中
-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (self.allowRotate == YES) {
return UIInterfaceOrientationMaskAll;
}else{
return UIInterfaceOrientationMaskPortrait;
}
}
三.在你想要横屏的界面
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.allowRotate = YES;
其他不需要横屏的界面
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.allowRotate = NO;
当然,前提是需要导入AppDelegate.m
很容易对不对?小心,坑来了哟
假设横屏的ViewController是A, A push B, B是竖屏.一般这个方法写在viewDidLoad中也没问题,但是我们再次从B回到A时,appDelegate.allowRotate = NO;这个时候不会再走viewDidLoad, 所以在A页面将不能横屏, 解决方法是写在viewWillAppear中.
其次,相比于网上其他常见方法, appDelegate.allowRotate = NO;这句只用写在A的根控制器和子控制器就好了, 因为appDelegate可以认为他是一个全局的变量.
四. 又是一个坑, 即使你在A的子页面B做了设置, 当你在A横屏的时候进入B,B还是横屏的,这样如果你在B没做适配的话,势必就很尴尬
解决方法:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
switch (interfaceOrientation) {
case UIInterfaceOrientationLandscapeRight:
self.warnButton.enabled = NO;
self.loginButton.enabled = NO;
break;
case UIInterfaceOrientationLandscapeLeft:
self.warnButton.enabled = NO;
self.loginButton.enabled = NO;
break;
case UIInterfaceOrientationPortrait:
self.warnButton.enabled = YES;
self.loginButton.enabled = YES;
break;
default:
break;
}
}
在A页面中禁掉跳转逻辑, 这个方法在设备每次旋转的时候都会自动调用. 当然设置了button.enable之后按钮会变灰,影响视觉,需要设置button 的 UIControlStateDisabled的图片.
以上, 单页横屏的bug基本修复, 有错误的地方还请指正!
网友评论