Get device current orientation (App Extension)

后端 未结 10 1474
执笔经年
执笔经年 2020-12-09 10:02

How to get device current orientation in an App Extension, I have tried below two methods but no success.

  1. It always return UIDeviceOrientationUnknown

    <
10条回答
  •  暖寄归人
    2020-12-09 10:44

    The observer method will get called if you add this before: [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

    Edit: I use UIApplicationDidChangeStatusBarOrientationNotification for the observer

    And in my method I check:

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; BOOL isPortrait = UIDeviceOrientationIsPortrait(orientation);

    Edit 2- Xcode 6.2 - iOS 7 & 8

    It seems that if you want to use this on both iOS 7 & 8, the code above will give you wrong result on iOS 7.

    So I use something else because on iOS 7 the mainScreen's bounds will never change, but on iOS 8 will change if the orientation changes.

    I've got 3 macros that will give me the right size of the screen's width & height regardless of the iOS version:

    #define IOS_VERSION_OLDER_THAN_8 ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)
    
    #define SCREEN_WIDTH_CALCULATED (IOS_VERSION_OLDER_THAN_8 ? (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) : [[UIScreen mainScreen] bounds].size.width)
    
    #define SCREEN_HEIGHT_CALCULATED (IOS_VERSION_OLDER_THAN_8 ? (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) : [[UIScreen mainScreen] bounds].size.height)
    

    Then, when the notification is fired, i check the orientation like this:

    BOOL isPortrait = SCREEN_WIDTH_CALCULATED < SCREEN_HEIGHT_CALCULATED;
    

    This will work on iOS 7 & iOS 8, but i didn't check for older versions of Xcode, only 6.2

    This will return only if the device is on portrait or landscape, not all the 4 orientation types

提交回复
热议问题