如何在 iOS 6 中以编程方式获取设备的当前方向?

Posted

技术标签:

【中文标题】如何在 iOS 6 中以编程方式获取设备的当前方向?【英文标题】:How to get current orientation of device programmatically in iOS 6? 【发布时间】:2012-12-12 09:26:23 【问题描述】:

我开发了一个 ios 应用并在 iOS6 设备上进行了测试。在测试时,我意识到我的应用没有像预期的那样响应方向变化。

这是我的代码:

// Autorotation (iOS >= 6.0)
- (BOOL) shouldAutorotate

    return NO;


- (NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskAll;


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

    return UIInterfaceOrientationMaskPortrait;

确切地说,我想知道在 iOS 中,Orientation Changes 调用了哪些方法。

【问题讨论】:

"我的代码在方向上不起作用。"是什么意思? 其实我想知道当我旋转我的设备时调用了哪个方法..? 它会调用 shouldAutorotate 方法和支持的界面定位方法 @MidhunMP 此方法在 iOS 6 中已弃用...这就是原因。 那是个误会,引入了shouldAutoRotate方法,而不是shouldAutorotateToInterfaceOrientation。并且可以在iOS5和iOS 6中使用 【参考方案1】:

你可以试试这个,可能对你有帮助:

How to change the device orientation programmatically in iOS 6

目标-c:

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]

斯威夫特:

if UIDevice.current.orientation.isLandscape 
    // Landscape mode
 else 
    // Portrait mode

【讨论】:

请注意The value of |orientation| property always returns 0 unless orientation notifications have been enabled by calling beginGeneratingDeviceOrientationNotifications. Docs 请注意,这与获取 ViewController 方向不同,因为它可能是横向的,但 UIDevice.current.orientation.isLandscape 仍可能返回 false。在我的例子中 UIDevice.current.orientation 是 .faceUp。【参考方案2】:

你可以试试这个,解决你的问题。

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

请参阅下面的链接以获取App extension Get device current orientation (App Extension)

【讨论】:

真是个坏主意。不要挂在那个属性上。 有人可以设置此属性statusBarOrientation,它将不再与真正的interfaceOrientation 相同。 The status-bar orientation set by this method does not change if the device changes orientation. @DanSkeel 怎么可能。我们使用此属性获得准确的当前方向。如果我们强行设置状态栏方向,那么我们有责任小心处理。 如果您编写一些工具或框架,您将无法控制所有代码。所以如果你想确定没有人这样做,你应该避免它。恕我直言。 我的意思是你无法控制使用你的框架的整个应用程序的代码。因为您正在编写框架,而不是应用程序。并且开发者可以设置而你不会知道。【参考方案3】:

也许很愚蠢,但它正在工作(仅在 ViewController 中):

if (self.view.frame.size.width > self.view.frame.size.height) 
    NSLog(@"Hello Landscape");

【讨论】:

非常有效。【参考方案4】:
  @property (nonatomic) UIDeviceOrientation m_CurrentOrientation ;

/* 您需要在您的 ViewDidload 或 ViewWillAppear 中声明这些代码 */

- (void)viewDidLoad

   

   [super viewDidLoad];

   [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

   [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];

/* 现在我们的设备会在我们改变设备方向时发出通知,因此您可以使用当前方向控制您的代码或程序 */

- (void)deviceOrientationDidChange:(NSNotification *)notification

 

 //Obtaining the current device orientation

 /* Where self.m_CurrentOrientation is member variable in my class of type UIDeviceOrientation */

 self.m_CurrentOrientation = [[UIDevice currentDevice] orientation];

    // Do your Code using the current Orienation 

 

【讨论】:

如何使用 self.m_CurrentOrientation 检查纵向和横向? if (UIDeviceOrientationIsLandscape(self.m_CurrentOrientation) // 横向代码 【参考方案5】:

按照UIDevice 上的文档进行操作。

你需要打电话

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

然后每次改变方向时你都会收到一个 UIDeviceOrientationDidChangeNotification。

【讨论】:

【参考方案6】:

This tutorial 给出了如何使用UIDeviceOrientationDidChangeNotification 处理设备旋转的简单概述。它应该可以帮助您了解如何使用UIDeviceOrientationDidChangeNotification 在设备方向更改时收到通知。

【讨论】:

【参考方案7】:
UIDevice.current.orientation.isLandscape

接受的答案如上所述读取设备的方向,报告的方向可能与您的视图控制器的方向不同,尤其是当您的设备几乎处于水平位置时。

要获取 视图控制器 的方向,您可以使用其 interfaceOrientation 属性,该属性自 iOS 8.0 起已弃用,但仍能正确报告。

【讨论】:

【参考方案8】:

在您的 ViewController 中,您可以使用didRotateFromInterfaceOrientation: 方法来检测设备何时旋转,然后在每个方向上执行您需要的任何操作。

例子:

#pragma mark - Rotation

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    switch (orientation) 
        case 1:
        case 2:
            NSLog(@"portrait");
            // your code for portrait...
            break;

        case 3:
        case 4:
            NSLog(@"landscape");
            // your code for landscape...
            break;
        default:
            NSLog(@"other");
            // your code for face down or face up...
            break;
    

【讨论】:

【参考方案9】:

斯威夫特5答案

订阅有关方向变化的通知:

override func viewDidLoad() 
   super.viewDidLoad()
    
   NotificationCenter.default.addObserver(self, selector: #selector(orientationChangedFromNotification), name: UIDevice.orientationDidChangeNotification, object: nil)

处理通知:

@objc func orientationChangedFromNotification() 
   self.updateUIForOrientation()

处理方向变化:

func updateUIForOrientation() 
   let orientation = UIDevice.current.orientation
   
   //TODO: Your logic

注意:这将告诉您物理设备的方向。也可以访问应用的界面方向:

UIApplication.shared.delegate?.window?.windowScene?.interfaceOrientation

【讨论】:

以上是关于如何在 iOS 6 中以编程方式获取设备的当前方向?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式更改设备方向?

在android中以编程方式获取屏幕密度?

如何以编程方式获取 iOS 设备 MAC 地址

在 ios 中以编程方式获取墙纸

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

如何在 iPhone sdk 中以编程方式获取设备名称?