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

问题描述 投票:0回答:10

我开发了一个iOS应用程序并在iOS6设备上进行了测试。在测试时,我意识到我的应用程序没有按预期响应方向更改。

这是我的代码:

// Autorotation (iOS >= 6.0)
- (BOOL) shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationMaskPortrait;
}

准确的说,我想知道iOS中Orientation Changes调用了哪些Methods。

iphone ios6 screen-orientation device-orientation ipad-3
10个回答
61
投票

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

如何在 iOS 6 中以编程方式更改设备方向

Objective-c:

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]

斯威夫特:

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

36
投票

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

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

请参阅以下链接

App extension
获取设备当前方向(应用程序扩展)


7
投票

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

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

6
投票
  @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 

 }

2
投票

遵循 UIDevice 上的文档。

你需要打电话

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

每次方向改变时,您都会收到 UIDeviceOrientationDidChangeNotification。


2
投票

本教程很好地简单概述了如何使用

UIDeviceOrientationDidChangeNotification
处理设备旋转。它应该可以帮助您了解如何使用
UIDeviceOrientationDidChangeNotification
在设备方向发生更改时收到通知。


1
投票
UIDevice.current.orientation.isLandscape

接受的答案读取设备的方向,如上所示,其报告的方向可能与视图控制器的方向不同,特别是如果您的设备保持在几乎水平的位置。

要具体获取视图控制器的方向,您可以使用其

interfaceOrientation
属性,该属性自 iOS 8.0 起已弃用,但仍能正确报告。


0
投票

在您的 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;
    }
}

0
投票

快速 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

0
投票

请注意,

[UIDevice currentDevice] orientation]
Application sharedApplication].statusBarOrientation
已弃用。

使用

deviceOrientationDidChange
通知似乎是获取当前方向的最佳常规方法,但它在应用程序启动时不提供方向,这对我来说是一个问题。

因此,在

ViewDidLoad
方法中,我读取屏幕尺寸来检测第一个方向:

CGSize __screenSize = [UIScreen];

但是在一定的延迟之前屏幕尺寸是不可靠的,所以我通过在1秒延迟后读取屏幕尺寸找到了我的解决方案,如下所示:

[self performSelector:@selector( readScreenSize ) withObject:nil afterDelay:1];

总而言之,它对我来说是这样的:

1/ 通过在短暂延迟后读取屏幕尺寸来检测第一个方向。

2/ 通过使用“deviceOrientationDidChange”通知检测方向变化。

祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.