iOS开发笔记

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

2016-11-14  本文已影响454人  嫌疑人zx

第一步:

首先,我定义了一个变量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 的使用之——强制屏幕旋转

上一篇下一篇

猜你喜欢

热点阅读