美文网首页iOS开发iOS开发ios框架
iOS指定页面屏幕旋转,手动旋转(某app实现功能全过程)

iOS指定页面屏幕旋转,手动旋转(某app实现功能全过程)

作者: Two_Seven | 来源:发表于2015-11-01 23:41 被阅读20465次

    背景: app内有一个双页的界面,然后某天运营说如果其中一页能支持横屏的话,对接的媒体就能给一整块屏幕,然后需求就这样下来了(双页:一页支持横屏效果,另一页不支持)。

    接下来就�是查文档时间了,Duang,一下就查到了有没有,就是下面这两个方法。

    //支持设备自动旋转

    - (BOOL)shouldAutorotate

    {  

         returnYES;

    }

    //支持横竖屏显示

    - (NSUInteger)supportedInterfaceOrientations

    {

    returnUIInterfaceOrientationMaskAll;

    }

    然后发现单纯这两个方法并没有什么用,因为看文档发现这个需要设置在根视图中,具体说明如下:

    方法说明

    也就是说到目前为止这两个方法是全局设置的(打断点发现其实是每个视图进行屏幕旋转时都会去根视图里请求这个方法),好吧,接着查,终于让我查到了解决方法。在根视图中还是继续调用这两个方法,但是shouldAutorotate方法稍微改动了一下,意思就是让系统再去当前显示的那个VC中去问应不应该允许屏幕旋转。

    接下来就可以在想要支持设备旋转的VC里重写这两个方法了。

    到这里其实指定视图的屏幕自动旋转其实就实现了,可是需求提的是在当前这个VC中两个页面一个支持旋转一个不支持旋转,所以便加上了一个BOOL属性值来判断地图页面是否展示,如果展示就支持旋转。

    功能实现了,接下来是页面适配。现在屏幕旋转过来完全无法直视啊,视图只展示在了屏幕左面的一小部分,接着去找解决方法。发现在屏幕旋转时系统会抛出来一个通知:

    UIApplicationDidChangeStatusBarOrientationNotification

    接下来在回调方法里面重新设置一下各个视图的frame就可以了,还有就是应该在各个View的layoutSubviews里面判断一下,为横竖屏分别写一下视图坐标。

    最后一个需求,屏幕方向的手动设置(因为一个界面支持横屏,如果在横屏模式下切回另一个只支持竖屏的界面就会出现问题,所以需要在切回之前重新设置下屏幕方向)。

    这里吐槽一下,真的一定要吐槽一下,在百度上搜了半天,也可能是我搜索的方式有问题吧,告诉我的都是那个已经被苹果私有化的那个方法,然后果断Stack Overflow,果断秒解决。

    手动设置横屏

    OK,到这里需求就完全实现了,另外说一下全局设置的方法,之前最上面的那个算一种,然后也可以在TARGETS设置里面勾选,也可以在AppDelegate中设置。

    TARGETS AppDelegate

    最后一点就是其实还有一种伪屏幕旋转,其实就是设置View的transform来旋转一定的角度,不过这个方法计算坐标实在是太伤脑筋了,感兴趣的可以自己试试。

    相关文章

      网友评论

      • 3b198480ed65:多谢,这几天一直在找和测试,原来是这个

        NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
        [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
      • kosser小屋:如果在工程里设置了横竖屏,那整个app都是可以旋转的。怎么让某个界面旋转?
      • 张云龙:首先使用私有API是可以审核通过的,控制uinavigationcontroller的子控制器都没有问题,但是若是在某个页面present一个页面时就失效了。
      • 小草先生:有一种方法可以控制某个控制器旋转,-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 在这个方法里判断是否是你需要旋转的控制器类名 是的话 设置旋转方向
        伦敦乡下的小作家:能写一下实例代码吗?
      • tunny:楼主,让系统再去当前显示的那个VC中去问应不应该允许屏幕旋转。中
        你的sideViewController是什么呢?
        雨燕oc:同问?
      • 老子不想去巡山:收藏以后研究一下
      • 西西西瓜sama:这样其实也有个问题 假如我不使用系统的 uinavigationcontroller 该如何处理
      • 郭秀才:其实kvo旋转是有问题的,请简单扫一下这篇文章http://www.jianshu.com/p/6c45fa2bb970 :smile:
      • 44074f73731a:为毛我iPhone设置是可以的,ipad上就不行了
      • 愤怒的杜拉拉丶:我差点以为真的解决了,居然用了水果的私有API,我保证这么写审核通不过。
        我本善良:@devjia 那你最开始的评论就是傻白甜的表现,多此一举!:sweat_smile:
        956dc576b0ec:@愤怒的杜拉拉丶 能不能不要那么傻白甜,有一百种方法可以让私有API通过审核。况且,这个就算直接用也没有问题的。
        Two_Seven:@愤怒的杜拉拉丶 其实一开始看到你的评论的时候我就想直接上来辩解,可又突然发现卧槽,我怎么解释,直接和你说这是我上架的商业项目里的代码吗。感觉这样你不会信服。

        然后我就开始番羽墙查各种资料,问了多个前辈。可是得出的结论还是不确定的,不过不论怎样我觉得还是要把结果说一下。

        首先可以确定的一点,上面的代码在当前版本都是可以直接调用的。不会出现审核不通过的现象。
        至于你说的私有API,我知道你怀疑的是哪句,很尴尬我得到了两种解释:
        一种说是私有API,但是因为不涉及到安全和隐私的问题,所以苹果不会干涉。
        另一种是说不是私有,而是KVC调用。
        其实我比较倾向于后一种,那段代码属于苹果的unpublished api,不过不论是那种方法,在当前版本都不会影响使用。

      • angelababa:请问一下如果是tabbarController根目录要怎么选?
      • LostAbaddon:有代码的文章请使用Markdown编辑器,并使用代码块语法:
        ```code-lang
        blablabla
        ```

      本文标题:iOS指定页面屏幕旋转,手动旋转(某app实现功能全过程)

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