iOS 简单暴力的解决单页面横屏的问题

其实这个问题困扰了很久,之前用了大部分人在用的方案,通过appdelegate的代理方法去控制,具体如下:

在Appdelegte的.h声明属性

@property (nonatomic, assign) BOOL allowRotate;

.m增加代理方法:


- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (self.allowRotate) {
        return UIInterfaceOrientationMaskAll;//适应所有方向
    }
    return UIInterfaceOrientationMaskPortrait;//竖屏
}

在需要横屏的页面

- (void)loadView
{
    [super loadView];
    //将标示改为YES
    AppDelegate *app = (AppDelegate *)[[UIApplication  sharedApplication] delegate];
    app.allowRotate = YES;
    
}

这样是能控制页面的横竖屏,但是启动页就没法控制了,启动是发生在Appdeleget之前的,因此就没法控制强制竖屏。而且这种方式有时候会出现Bug。

再简单说明下我项目中的情况,只有签名页需要横屏【进入签名页就横屏】,我希望的是项目强制竖屏,这个页面通过其他方式做到横屏效果。

这里我们先将项目设置里面的屏幕控制只勾选 Portrait,然后通过transform来实现

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    // 旋转角度 0.5➡️横屏 1.5⬅️横屏 2⬆️竖屏 1⬇️竖屏
    CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;//时间
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];
    self.navigationController.view.transform = CGAffineTransformIdentity;
    self.navigationController.view.transform = CGAffineTransformMakeRotation(M_PI*0.5);
    self.navigationController.view.bounds = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width);
    [UIView commitAnimations];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    //视图将要消失的时候 再把视图翻转回来 ,不会影响其他VC的展示
    CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:duration];
    self.navigationController.view.transform = CGAffineTransformIdentity;
    //
    self.navigationController.view.transform = CGAffineTransformMakeRotation(M_PI*2);
    self.navigationController.view.bounds = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height);
    [UIView commitAnimations];
}

这样的话状态栏不会旋转,状态栏是根据系统旋转才会变动的,因此在这个页面将状态栏隐藏

- (BOOL)prefersStatusBarHidden {
    return YES;
}
- (void)viewDidLoad {
    [super viewDidLoad];

    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
        [self prefersStatusBarHidden];
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }
}

这样处理在进入页面就横屏的单页面简直完美。