如何检查iPhone现在在哪个位置(横向或纵向)?

我有一个标签栏的应用程序,并在每个选项卡中的导航控制器。 当用户摇动设备时, UIImageView在导航控制器中显示为子视图。 但是UIImageView必须包含一个特殊的图像,取决于设备的当前方向。

如果我只写

 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { //Code } else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight||interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { //Code } } 

如果用户在摇动之前旋转了设备,视图就会变得疯狂。

有没有一种方法来获取iPhone目前的方向?

按照此处的指定使用[[UIDevice currentDevice] orientation]方法。

这里是macrosUIDeviceOrientationIsLandscapeUIDeviceOrientationIsPortrait

所以宁愿单独检查你可以这样做…

 if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) { // code for landscape orientation } 

要么

  if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) { // code for Portrait orientation } 

正如beno所说,如果您在视图的早期检测到方向,这似乎是一个更好的答案。 我无法得到批准的答案,以在我的设置早期返回结果,但这是奇妙的作品。

 if (UIDeviceOrientationIsPortrait(self.interfaceOrientation)){ //DO Portrait }else{ //DO Landscape } 

要插入已经回答的问题:

你使用[[UIDevice currentDevice] orientation]将会产生这些值之一:

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

文档可以在这里find- (方向)和在这里 – (UIDeviceOrientation) 。

(我不是故意要求前者,但是这个消息很重要。)

你也可以使用UIViewController类的interfaceOrientation属性,如果你从UIDevice持续获取UIDeviceOrientationUnknown。

有一个很好的总结为什么[UIDevice currentdevice]方向有时可能会失败: http : //bynomial.com/blog/?p=25 ,特别是如果你想快速检测方向(例如,如果你想当应用程序离开后台时检查)。

它可以帮助你…

 -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation ]== UIDeviceOrientationLandscapeRight) { NSLog(@"Lanscapse"); } if([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown ) { NSLog(@"UIDeviceOrientationPortrait"); } } 

你也可以定义常量来赚取时间:

 #define LANDSCAPE UIInterfaceOrientationIsLandscape(self.interfaceOrientation) #define LANDSCAPE_RIGHT [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft #define LANDSCAPE_LEFT [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight #define PORTRAIT UIInterfaceOrientationIsPortrait(self.interfaceOrientation) #define PORTRAIT_REVERSE [UIDevice currentDevice].orientation == UIDeviceOrientationPortraitUpsideDown 

尝试这个:

 [[UIApplication sharedApplication] statusBarOrientation] 

或者在Swift 3中:

 UIApplication.shared.statusBarOrientation 

要专门检查特定的方向,您还可以尝试isLandscape或isPortrait属性,如:

 UIApplication.shared.statusBarOrientation.isLandscape 

[[UIDevice currentDevice]方向]的问题是,它也将返回statusBarOrientation不支持的UIInterfaceOrientetionUnknown。

还有一个UIViewController属性“interfaceOrientation”,但它在iOS 8中已被弃用,所以不build议使用它。

您在这里检查statusBarOrientation的文档

我结束了这样的检查(Swift 3):

 var isPortrait: Bool { let orientation = UIDevice.current.orientation switch orientation { case .portrait, .portraitUpsideDown: return true case .faceUp: // Check the interface orientation let interfaceOrientation = UIApplication.shared.statusBarOrientation switch interfaceOrientation{ case .portrait, .portraitUpsideDown: return true default: return false } default: return false } } 

获取当前的方向

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; if (orientation == UIInterfaceOrientationLandscapeLeft) { NSLog(@"Landscape left"); self.lblInfo.text = @"Landscape left"; } else if (orientation == UIInterfaceOrientationLandscapeRight) { NSLog(@"Landscape right"); self.lblInfo.text = @"Landscape right"; } else if (orientation == UIInterfaceOrientationPortrait) { NSLog(@"Portrait"); self.lblInfo.text = @"Portrait"; } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { NSLog(@"Upside down"); self.lblInfo.text = @"Upside down"; } }