iOS開發 詳解強制螢幕旋轉的方法

weixin_33850890發表於2016-11-14

第一步:

首先,我定義了一個變數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 的使用之——強制螢幕旋轉

相關文章