美文网首页iOS在路上Swift&Objective-C
iOS转屏控制代码(shouldAutorotate/suppo

iOS转屏控制代码(shouldAutorotate/suppo

作者: __zimu | 来源:发表于2016-12-08 18:38 被阅读2058次

前言

需求是这样的:
在控制器A中, 不允许转屏, 只能是竖屏
push到控制器B之后, 允许控制器自动转屏幕

实现方式

正常的实现逻辑中, 只需要在控制器A中实现以下

- (BOOL)shouldAutorotate {
    return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

就可以实现了

但是今天遇到这么个问题, 无论怎么设置, 这些代码也执行, 但是都不起作用, 屏幕依然可以旋转.

问题

大概的查了一下, 跟UINavigationController, UITabBarController相关的控制器, 会默认的走这两个基类的转屏方法, 自己写的这个就不会生效了, 检查appDelegate中发现如下代码:

    LCPlayerViewController *mainViewController = [[LCPlayerViewController alloc] initWithNibName:@"LCPlayerViewController"
                                                                                          bundle:nil];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
    navigationController.navigationBarHidden = YES;
    self.navigationController = navigationController;
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;

解决方法

由于基本是UINavigationController, 所以跟上面说的那个一致, 自己实现的shouldAutorotate等方法不管用了, 于是解决办法如下:

    LECBaseNavigationController *navigationController = [[LECBaseNavigationController alloc] initWithRootViewController:mainViewController];

把创建的Nav变成了自己的一个Nav子类, 定义如下:

#import "LECBaseNavigationController.h"

@interface LECBaseNavigationController ()

@end

@implementation LECBaseNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (BOOL)shouldAutorotate {
    return self.topViewController.shouldAutorotate;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return self.topViewController.supportedInterfaceOrientations;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return self.topViewController.preferredInterfaceOrientationForPresentation;
}

@end

重写了三个跟转屏相关的方法, 把转屏的控制归还给实际的控制器, 再编译运行, 就可以实现自己的控制器控制自己转屏方向了.
代码在这

https://github.com/dfzr86/ScreenOrientationsDemo

有问题请加QQ:1547213

相关文章

  • iOS转屏控制代码(shouldAutorotate/suppo

    前言 需求是这样的:在控制器A中, 不允许转屏, 只能是竖屏push到控制器B之后, 允许控制器自动转屏幕 实现方...

  • iOS学习资料五

    1、控制屏幕旋转,在控制器中写 /** 是否支持自动转屏 */ - (BOOL)shouldAutorotate ...

  • ios rotation 横屏竖屏的问题

    以下问题只针对ios6之后的横竖屏设置,具体代码如下: - (BOOL)shouldAutorotate {ret...

  • iOS-屏幕旋转调用与监听的方法

    - (BOOL)shouldAutorotate { //返回是否允许转屏 return YES; } - (UI...

  • ios实现屏幕旋转的方法

    1、屏蔽AppDelegate下面的屏幕旋转方法 (BOOL)shouldAutorotate {//是否允许转屏...

  • 屏幕旋转和弹出框

    iOS中控制屏幕旋转相关方法 shouldAutorotate:是否支持屏幕旋转 alertView:clicke...

  • iOS-旋转屏幕

    iOS的转屏可以由三个地方控制: AppDelegate 中的下面这个代理方法控制:(返回值是允许转屏的类型) G...

  • IOS9之后设置屏幕强制横屏

    1、IOS8之后有的方法写到类里强制横屏之后已经没有用了 -(BOOL)shouldAutorotate{ ret...

  • iOS转屏控制分析

    在iOS开发中,绝大部分页面都只支持竖屏显示,只有个别页面要支持横屏显示,这种场景很常见。这篇文章我会介绍一下我在...

  • pragma mark ----只支持横屏 -(BOOL)shouldAutorotate{return NO;}...

网友评论

    本文标题:iOS转屏控制代码(shouldAutorotate/suppo

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