美文网首页
关于设置横竖屏的问题总结

关于设置横竖屏的问题总结

作者: 欠揍的葡萄 | 来源:发表于2017-06-02 15:50 被阅读0次

    项目需求:首页不横屏 从首页进入下一个控制器是一个播放界面,用于播放视频,该界面会自动旋转屏幕,并且可以手动旋转屏幕,可以锁定屏幕。

    程序结构:根控制器 UINavigationController , 首页控制器 UIViewControlle 播放控制器 UIViewController

    下面我们来实现屏幕旋转
    1. 首先,我们需要一个全局变量,来标示是否允许旋转,可以在AppDelegate.h文件中 如下声明
      @property (nonatomic,assign)BOOL allowRotation;
      这里,我们可以定义一个宏,方便我们使用AppDelegate
      #define ApplicationDelegate ((AppDelegate *)[UIApplication sharedApplication].delegate)

    然后在AppDelegate.m文件中 实现允许屏幕的方向函数 如下

    - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
        if (self.allowRotation) {
            return UIInterfaceOrientationMaskAll;
        }
        return UIInterfaceOrientationMaskPortrait;
    }
    

    2.然后在根控制器中实现允许屏幕旋转的方法 如下
    <pre>- (BOOL)shouldAutorotate{
    return ApplicationDelegate.allowRotation;
    }
    </pre>
    3.然后就可以愉快的玩耍了

    当想要旋转屏幕的时候,就去修改ApplicationDelegate.allowRotation的值,默认是NO,是不支持旋转的,所以满足我们的需求

    当我们从首页进入播放界面的时候
    在页面将要出现的时候 设置为YES
    在页面将要消失的时候 设置为NO
    如下:

    -  (void)viewDidDisappear:(BOOL)animated{
        [super viewDidDisappear:animated];
        ApplicationDelegate.allowRotation==NO;
    }
    
    -  (void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:animated];
        ApplicationDelegate.allowRotation==YES;
    }
    
    

    在控制器下还需添加一个通知,用来监听手机方向是否改变,如下:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(changeFrames:) name:UIDeviceOrientationDidChangeNotification
                                                   object:nil];
    

    当方向改变的时候,会触发changeFrames方法,然后在该方法里面去判断ApplicationDelegate.allowRotation的值,如果YES就去改变控件的Frame

    4.手动旋转屏幕

    有时候自动旋转并不能满足我们的需求,还需要用户手动的去点击按钮,触发旋转事件,这里,提供手动旋转函数,直接调用即可。

    /**
     *  手动旋转屏幕方法
     *
     *  @param orientation 屏幕方向
     */
    - (void)forceOrientation: (UIInterfaceOrientation)orientation {
        if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
            SEL selector = NSSelectorFromString(@""setOrientation:"");
            NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
            [invocation setSelector:selector];
            [invocation setTarget: [UIDevice currentDevice]];
            int val = orientation;
            [invocation setArgument:&amp;val atIndex:2];
            [invocation invoke];
        }
    }
    
    

    注意:屏幕旋转的前提是ApplicationDelegate.allowRotation的值为YES才可以,否则会无效或者屏幕出现比较诡异的效果。

    相关文章

      网友评论

          本文标题:关于设置横竖屏的问题总结

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