獲取設備朝向&監聽設備朝向

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);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • 改變別人不如改變自己,最主要的原因是改變別人需要錢,權利,或者特異功能,而這些我都沒有。所以現在趕快去賺錢吧。 擠...
    CountryWise閱讀 220評論 0 0
  • 重要的不是治愈,而是帶著傷前行 剛看到這句話時一下觸動了我的內心,之前問一個朋友生命的意義是什么?他說生命本沒意義...
    廖望閱讀 1,110評論 0 2
  • 我們總是對一切的未知充實憧憬和期待,未做過的事,未走過的路,甚至是未嘗過的食物。因此,我們開啟了彩云之南的...
    日未央閱讀 263評論 0 0