UIDeviceOrientationFaceUp - 如何区分肖像和风景?

n.e*_*ind 19 iphone cocoa-touch ipad landscape-portrait uideviceorientation

我试图找出设备是纵向还是横向模式.如果设备没有朝上,我的代码工作得很好.如果它面朝上(和方向== 5),它将无法区分肖像和风景.如果UIDeviceOrientation是FaceUp,有没有在风景/肖像方面确定"方向"?

我的代码:

UIDeviceOrientation interfaceOrientation = [[UIDevice currentDevice] orientation];

NSLog(@"orientation: %d", interfaceOrientation);

if (interfaceOrientation == UIDeviceOrientationIsLandscape(interfaceOrientation)) {
    NSLog(@"LANDSCAPE!!!");
}

if (interfaceOrientation == UIDeviceOrientationIsPortrait(interfaceOrientation)) {
    NSLog(@"PORTRAIT!!!");
}
Run Code Online (Sandbox Code Playgroud)

jba*_*100 41

你不应该混淆UIDeviceOrientationUIInterfaceOrientation,它们是不同的,但相关的如通过其声明

typedef enum {
   UIDeviceOrientationUnknown,
   UIDeviceOrientationPortrait,
   UIDeviceOrientationPortraitUpsideDown,
   UIDeviceOrientationLandscapeLeft,
   UIDeviceOrientationLandscapeRight,
   UIDeviceOrientationFaceUp,
   UIDeviceOrientationFaceDown
} UIDeviceOrientation;

typedef enum {
   UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
   UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
   UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
   UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
} UIInterfaceOrientation;
Run Code Online (Sandbox Code Playgroud)

UIDeviceOrientation告诉你设备的方向是什么.UIInterfaceOrientation告诉您界面的方向是什么,并由谁使用UIViewController.UIInterfaceOrientation显然是纵向或横向的,而UIDeviceOrientation可以具有不明确的值(UIDeviceOrientationFaceUp,UIDeviceOrientationFaceDown,UIDeviceOrientationUnknown).

在任何情况下,你不应该试图确定与一个UIViewController的方向[[UIDevice currentDevice] orientation],因为无论什么设备方向是UIViewController interfaceOrientation财产可以是不同的(例如,如果您的应用程序不旋转为横向,都[[UIDevice currentDevice] orientation]可以UIDeviceOrientationLandscapeLeft同时viewController.interfaceOrientation可以UIInterfaceOrientationPortrait).

更新: 自iOS 8.0起,[UIViewController interfaceOrientation]不推荐使用.这里提供的替代方案是[[UIApplication sharedApplication] statusBarOrientation].这也回来了UIInterfaceOrientation.


Mar*_*oGT 5

我创建这个代码框架来处理有意和不需要的设备方向,在我的情况下,我想忽略UIDeviceOrientationUnknown,UIDeviceOrientationFaceUp和UIDeviceOrientationFaceDown,缓存最后允许的方向.此代码适用于iPhone和iPad设备,对您有用.

- (void)modXibFromRotation {

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    NSString *device = [[UIDevice currentDevice]localizedModel];
    UIInterfaceOrientation cachedOrientation = [self interfaceOrientation];

    if ([device isEqualToString:@"iPad"]) {

        if (orientation == UIDeviceOrientationUnknown || 
            orientation == UIDeviceOrientationFaceUp || 
            orientation == UIDeviceOrientationFaceDown) {

                orientation = (UIDeviceOrientation)cachedOrientation;
        }

        if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight) {

            /* Your code */
        }

        if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown) {

            /* Your code */     
        }
    }

    if ([device isEqualToString:@"iPhone"] || [device isEqualToString:@"iPod"]) {

        if (orientation == UIDeviceOrientationUnknown || 
        orientation == UIDeviceOrientationFaceUp || 
        orientation == UIDeviceOrientationFaceDown) {

            orientation = (UIDeviceOrientation)cachedOrientation;
        }

        if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight) {

             /* Your code */
        }

        if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown) {

            /* Your code */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)