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

第一步:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,883评论 0 9
  • 目录 Objective-C Runtime到底是什么 Objective-C的元素认知 Runtime详解 应用...
    Ryan___阅读 5,931评论 1 3
  • 1.监听屏幕旋转方向 在处理iOS横竖屏时,经常会和UIDeviceOrientation、UIInterface...
    彬至睢阳阅读 7,303评论 1 6
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 9,680评论 2 19
  • 2016-5-26 今天晚上8点多的时候,不甘心的我,再次查看了我的锁状态,吃惊的发现已经变成了“关闭”状态。让我...
    峰眼看世界阅读 1,328评论 0 2

友情链接更多精彩内容