工作中遇到這樣一個需求,在當手機投影到airDrop設備時要跟投影的設備屏幕方向保持一致,用戶鎖定時也要隨投影設備旋轉,用戶沒有鎖定時只隨投影設備旋轉,而不能隨手機旋轉。
花了一上午時間,搞定了這個問題,發現網上的資料都是iOS8之前的,很多都是過時的,或都不夠全面,現在總結如下:
1.beginGeneratingDeviceOrientationNotifications endGeneratingDeviceOrientationNotifications
這兩個是控制屏幕旋轉的通知,通知在手機轉動時觸發,觸發后會執行下面的方法
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window? NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
-(BOOL)shouldAutorotate
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
其中后兩個是寫在VC中的,只能在present出來的VC才能生效,第一個是寫在AppDelegate中,全局生效。
在屏幕要旋轉后會執行
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator NS_AVAILABLE_IOS(8_0);
只要屏幕轉動都會觸發,就算手機沒有轉動強制橫豎屏有屏幕有轉動也會觸發。
2.關于方向的幾個枚舉
UIInterfaceOrientationMask:支持的方向。
UIInterfaceOrientation:手機界面的方向。
UIDeviceOrientation:設備當前的方向,這個是個坑,用戶鎖定了后永遠是Unknown,而且沒鎖定的情況下也不是很準確。
這幾個枚舉在不注意的情況下可能會搞混,注意下就行
3.強制橫豎屏
網上的方法有好幾種,最后發現還是下面這個有用,其他的都不行。
NSNumber *orientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
注意這個方法執行前要保證supportedInterfaceOrientations一定要包括要強制旋轉的方向,不然會閃退,要想保證不出現閃退可以supportedInterfaceOrientations設成ALL