UIDeviceOrientation枚舉值:
UIDeviceOrientationUnknown,
UIDeviceOrientationPortrait, // 豎向-home鍵在下
UIDeviceOrientationPortraitUpsideDown, // 豎向-home鍵在上
UIDeviceOrientationLandscapeLeft, // 橫向-home鍵在左
UIDeviceOrientationFaceDown // 橫向-home鍵在右
UIDeviceOrientationFaceUp, // 平放-朝上
UIDeviceOrientationFaceDown // 平放-朝下
- 1 主動獲取朝向
//主動生成設備朝向的通知 使用時注意該方法有延遲,調用后立即獲取朝向無法正常獲取
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//獲取設備朝向 必須生成設備朝向的通知
NSLog(@"%zd", [UIDevice currentDevice].orientation);
});
- 2 監聽朝向變化
//監聽朝向變化 通過監聽通知來實現 UIDeviceOrientationDidChangeNotification 當朝向發生變化后調用監聽通知的響應方法,一旦開啟監聽,默認就會調用一次響應方法
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
監聽設備朝向變化時調用的方法,只要設備朝向一發生改變,就能實時獲取朝向了
//朝向發生變化后調用
- (void)orientationDidChange{
//監聽橫豎屏變化 根據橫豎屏情況設置不同的主視圖寬度
if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) { //豎向
//設置主視圖的最大寬度
self.maximumPrimaryColumnWidth = 60;
} else { //橫向
//設置主視圖的最大寬度
self.maximumPrimaryColumnWidth = 200;
}
}
示例代碼:
#import "JSSplitViewController.h"
@interface JSSplitViewController ()
@end
@implementation JSSplitViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self prepareSplitViewController];
}
// 設置SplitViewController
- (void)prepareSplitViewController {
// 設置SplitViewController顯示模式:主視圖和明細視圖始終顯示
self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
// 監聽設備朝向變化
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChangeNotification) name:UIDeviceOrientationDidChangeNotification object:nil];
}
// 監聽設備朝向變化時調用的方法
- (void)orientationDidChangeNotification{
// 根據橫豎屏變化,設置不同的主視圖寬度
if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) { // 豎屏
self.maximumPrimaryColumnWidth = 60;
}else { // 橫向
self.maximumPrimaryColumnWidth = 200;
}
}
@end
當設備旋轉時,豎屏下,讓主視圖的寬度為60;橫屏下,主視圖寬度為200
橫屏:
horizontal.png
豎屏:
vertical.png
判斷橫豎屏時,使用了系統提供的一個內聯函數,通過這個函數,直接幫我們完成了朝向的判斷,這樣就簡單實現了判斷,免去了自己判斷
static inline BOOL UIDeviceOrientationIsPortrait(UIDeviceOrientation orientation) __TVOS_PROHIBITED {
return ((orientation) == UIDeviceOrientationPortrait || (orientation) == UIDeviceOrientationPortraitUpsideDown);
}
static inline BOOL UIDeviceOrientationIsLandscape(UIDeviceOrientation orientation) __TVOS_PROHIBITED {
return ((orientation) == UIDeviceOrientationLandscapeLeft || (orientation) == UIDeviceOrientationLandscapeRight);
}