iOS controller横屏与竖屏的实现

作者: 武小寺 | 来源:发表于2016-06-20 19:17 被阅读2285次

    关于横竖屏一直是一个坑爹的东西.
    但是苹果还是不错的,好多东西都给了可视化的菜单,还是比较不错的!

    横竖屏.png

    上图是设置应用都支持哪几个方向的勾选菜单!

    //  默认情况,home键在下
    UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
    // home键在上
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
    // home键在左
     UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
    // home键在右
    UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
    

    1.强制横屏(只在modal视图的时候有效)

    适用于一些强制横屏的播放器,或者某些特殊的设计页面

    #pragma mark --
    #pragma mark  强制横屏代码
    - (BOOL)shouldAutorotate
    {
        //是否支持转屏
        return YES;
    }
    
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations
    {
        //支持哪些转屏方向
        return UIInterfaceOrientationMaskLandscape;
    }
    
    //进入界面直接旋转的方向
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationLandscapeRight;
    }
    // 是否隐藏状态栏
    - (BOOL)prefersStatusBarHidden
    {
        return NO;
    }
    

    2.在代码中,让应用中的部分界面自动跟着手机旋转旋转!(push和modal都有效)

    适用于很多情况!!!

    2.1第一步勾选,只用支持的旋转方向
    旋转方向.png

    如果设计要求,值旋转左右的某一个方向,请自行选择!!!

    2.2第二步,应用中肯定会有navVC 或者 tabVC,设置代码,因为navVC和tabVC的工作原理不一样,所以代码也不一样

    navVC中的代码(nav是存在栈里的VC)

    -(BOOL)shouldAutorotate
    {  //允许旋转
         return YES;
    }
    -(UIInterfaceOrientationMask)supportedInterfaceOrientations
    {   //返回nav栈中的最后一个对象支持的旋转方向
         return [self.viewControllers.lastObject supportedInterfaceOrientations];
    }
    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {    // 返回nav栈中最后一个对象,坚持旋转的方向
        return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
    }
    

    tabVC代码(tab是选中的VC)

    - (BOOL)shouldAutorotate
    {
        return [self.selectedViewController shouldAutorotate];
    }
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations
    {
        return [self.selectedViewController supportedInterfaceOrientations];
    }
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return [self.selectedViewController preferredInterfaceOrientationForPresentation];
    }
    

    设置完子视图控制器容器的旋转状态和方向之后,现在是允许所有的子控制器都可以进行旋转!

    2.3然后我们需要设置不想进行旋转的控制器就OK了,想进行旋转的VC什么都不用设置!
    - (BOOL)shouldAutorotate
    {    // 不允许进行旋转
        return NO;
    }
    -(UIInterfaceOrientationMask)supportedInterfaceOrientations
    {    // 返回默认情况
        return UIInterfaceOrientationMaskPortrait ;
    }
    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {    // 返回默认情况
        return UIInterfaceOrientationPortrait;
    }
    

    3.使用单例去控制navVC或者tabVC是否支持旋转,来实现界面的旋转

    3.1勾选的地方全部勾掉
    3.1.png
    3.2创建单例,加一个属性是否可以旋转
    @interface Single : NSObject
    
    @property (nonatomic, assign) BOOL isRoat;
    
    + (Single *)single;
    
    @end
    
    3.3设置navVC和tabVC里面的代码
    - (BOOL)shouldAutorotate{
        return [Single single].isRoat;
    }
    
    - (UIInterfaceOrientationMask)supportedInterfaceOrientations
    {
        // 这里可以选择任意的方向
        return UIInterfaceOrientationMaskAll;
    }
    
    3.4在你想要横屏的界面代码设置
    - (void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        [Single single].isRoat = YES;
    }
    
    - (void)viewWillDisappear:(BOOL)animated{
        [super viewWillDisappear:animated];
        [Single single].isRoat = NO;
    }
    

    方法二的原理就是,先设置应用支持任意方向旋转,然后去设置子控制器是否可以旋转,因为如果navVC或者tabVC不支持旋转,让自控制器去实现旋转是一件非诚复杂而且容易出bug的事情!
    小建议:在写项目的时候,为我们的不同旋转方向的VC各创建一个基类VC,然后新创建的VC继承于基类,这样会少写很多代码!

    相关文章

      网友评论

      • 2ede4a8a7da0:楼主 : 麻烦问个问题 ,我这个是一个老的项目 里面有Nav 和 Tabber, 是一年前的项目了。最近来的新的需求 只要求 某一个页面需要横屏,按照你的第二种方法 是在不需要旋转的设置为NO,那样我得代码量会很大 , 也可能会乱,能不能 只针对某个页面需要横屏做处理 ???谢谢
        武小寺:@Mr_hao 之前的VC没有基类吗,你搞个基类,只要旋转的那个不继承就行,别的继承这个基类,要不就强制旋转,用第一种方法
      • Damon4Zhou:有个问题,我选择第二种方法:
        app的windows的rootviewcontroller是一个uitabbarcontroller,里面放了两个UINavigationController,每个UINavigationController中有viewcontroller,结构是这样的;
        假设这个viewcontroller是A和B,A设置为只支持横向,B只支持竖向,app启动时,A先展示出来,为横向,然后点击tabbar切换到B(当前手机是竖着的,并保持不旋转),发现B仍然展示为横向,只有当把手机先横向再竖向才会显示正常(正常应该为竖向),这是为什么????
        Damon4Zhou:@武小寺 真机
        武小寺:@Damon4Zhou 你是模拟器测试的还是真机测试的,我真没试过这种的
      • shopping627:谢谢楼主,我的问题解决了。
        Damon4Zhou:@武小寺 第二种方法比较实用
        武小寺:@shopping627 解决了就好,多交流
      • sfandy:这种方式问题很多
        sfandy:@Damon4Zhou 你看看我写的就知道了。我已经解决了。
        Damon4Zhou:@sfandy 会出什么问题??请教下,有什么更好的方法吗?

      本文标题:iOS controller横屏与竖屏的实现

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