美文网首页iOS开发笔记
iOS开发 详解强制屏幕旋转的方法

iOS开发 详解强制屏幕旋转的方法

作者: 嫌疑人zx | 来源:发表于2016-11-14 15:39 被阅读454次

    第一步:

    首先,我定义了一个变量isFullScreen,用于判断当前视图是处于横屏状态还是竖屏状态。YES为横屏,NO为竖屏。

    BOOL _isFullScreen
    

    第二步:

    我写了一个方法用于执行转屏的操作,不论是横屏,还是竖屏操作都可以调用这个方法,里面会根据当前的状态,判断是该横屏还是竖屏!

    - (void)changeScreenAction{
        SEL selector=NSSelectorFromString(@"setOrientation:");
        NSInvocation *invocation =[NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
        [invocation setSelector:selector];
        [invocation setTarget:[UIDevice currentDevice]];
        int val = _isFullScreen?UIInterfaceOrientationLandscapeRight:UIInterfaceOrientationPortrait;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
    
    解析:
    1. 找到setOrientation:方法对应的SEL类型的数据,我用了一个局部变量selector暂存起来
       SEL selector=NSSelectorFromString(@"setOrientation:");
    

    2.NSInvocation 是实现命令模式的一种,可以调取任意的SEL或block。当NSInvocation被调用,它会在运行时,通过目标对象去寻找对应的方法,从而确保唯一性。
    NSInvocation创建方法

    + (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)sig;
    

    NSMethodSignature是一个方法签名的类,通常使用下面的方法,获取对应方法的签名

    [消息接受者 instanceMethodSignatureForSelector:selector];
    

    eg:

    NSInvocation *invocation =[NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
    

    3.设置方法:

    [invocation setSelector:selector];
    

    4.设置执行方法的对象

    [invocation setTarget:[UIDevice currentDevice]];
    

    5.判断当前的状态是横屏还是竖屏。利用三目运算符,得到UIInterfaceOrientationLandscapeRight(横屏)或UIInterfaceOrientationPortrait(竖屏),得到的结果其实是一个枚举,如下:

    typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
        UIInterfaceOrientationUnknown            = UIDeviceOrientationUnknown,
        UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
        UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
        UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
        UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
    }
    

    对应的代码如下:

    int val = _isFullScreen?UIInterfaceOrientationLandscapeRight:UIInterfaceOrientationPortrait;
    

    6.设置执行方法的参数

    - (void)setArgument:(void *)argumentLocation atIndex:(NSInteger)idx;
    

    argumentLocation传递的是参数的地址。index 从2开始,因为0 和 1 分别为 target 和 selector。
    7.调用这个方法

    [invocation invoke];
    

    参考:NSInvocation 的使用之——强制屏幕旋转

    相关文章

      网友评论

        本文标题:iOS开发 详解强制屏幕旋转的方法

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