如何检查iPhone现在在哪个位置(横向或纵向)?
我有一个标签栏的应用程序,并在每个选项卡中的导航控制器。 当用户摇动设备时, UIImageView
在导航控制器中显示为子视图。 但是UIImageView
必须包含一个特殊的图像,取决于设备的当前方向。
如果我只写
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { //Code } else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight||interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { //Code } }
如果用户在摇动之前旋转了设备,视图就会变得疯狂。
有没有一种方法来获取iPhone目前的方向?
按照此处的指定使用[[UIDevice currentDevice] orientation]
方法。
这里是macrosUIDeviceOrientationIsLandscape
和UIDeviceOrientationIsPortrait
所以宁愿单独检查你可以这样做…
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"; } }