第一步:
首先,我定义了一个变量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];
}
解析:
- 找到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];
网友评论