iOS横屏(单页)

作者: Just_go | 来源:发表于2016-12-14 23:25 被阅读328次

项目中会遇到一页是横屏,其他保持竖屏的情况
一.在横屏的页面用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基本修复, 有错误的地方还请指正!

相关文章

网友评论

    本文标题:iOS横屏(单页)

    本文链接:https://www.haomeiwen.com/subject/mjsymttx.html