如何知道 iOS 8 中的当前 interfaceOrientation?

Posted

技术标签:

【中文标题】如何知道 iOS 8 中的当前 interfaceOrientation?【英文标题】:How to know current interfaceOrientation in iOS 8? 【发布时间】:2015-01-15 15:27:00 【问题描述】:

现在UIViewController 中的interfaceOrientation 属性已被弃用,检测当前设备方向的推荐方法是什么?

【问题讨论】:

【参考方案1】:

您可以使用[UIApplication sharedApplication].statusBarOrientation

注意[[UIDevice currentDevice] orientation] 不完全像您的应用程序轮换。文档:

讨论: 该属性的值是一个常数,指示设备的当前方向。此值表示设备的物理方向,可能与应用程序用户界面的当前方向不同。有关可能值的说明,请参阅 UIDeviceOrientation。

我会检查 statusBarOrientation 是否有效。

【讨论】:

【参考方案2】:

在 Swift 中,您可以使用

let orientation: UIInterfaceOrientation = UIApplication.shared.statusBarOrientation

【讨论】:

【参考方案3】:

UIApplication.sharedApplication().statusBarOrientation 有效,除非你从

func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

它先于对新 statusBarOrientation 的更改

所以如果你使用 viewWillTransitionToSize 来更新 基于方向(而不是尺寸等级)的设备你被搞砸了 并且必须使用这样的东西

extension UIViewController 
    public var orientation : UIInterfaceOrientation? 
        let orientation = UIDevice.currentDevice().orientation
        var converted : UIInterfaceOrientation!
        // UIApplication.sharedApplication().statusBarOrientation is trash cause it lags (being set to the value predating the transition reported by viewWillTransitionToSize)
        switch orientation 
        case .Portrait: // Device oriented vertically, home button on the bottom
            converted = .Portrait
        case .PortraitUpsideDown: // Device oriented vertically, home button on the top
            converted = .PortraitUpsideDown
        case .LandscapeLeft: // Device oriented horizontally, home button on the right
            converted = .LandscapeLeft
        case .LandscapeRight: // Device oriented horizontally, home button on the left
            converted = .LandscapeRight
        default:
            // let the caller do the dirty dancing with the status bar orientation or whatever
            return nil
        
        return converted
    

你会这样使用:

    // willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) is deprecated.
    // thusly I have to use the size classes method and compute interface orientation from the device orientation
    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        guard let converted = orientation else 
            //            alert("something else that I do not [need to] handle")
            return
        
        if converted.isLandscape 
            adjustViewsForOrientation(converted, withTransitionCoordinator: coordinator)
         else if converted.isPortrait 
            adjustViewsForOrientation(converted, withTransitionCoordinator: coordinator)
        
    

我不知道如何摆脱这个(糟糕的)勇敢的新世界 令人信服的苹果将不赞成使用 willRotateToInterfaceOrientation 就像他们对 autoresizingMask 所做的一样 (除非他们有理由不弃用 autoresizingMask ;-)

或者将 interfaceorientation 作为第三个参数注入 viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

【讨论】:

【参考方案4】:

适用于 iPad

[[UIDevice currentDevice] orientation];

【讨论】:

但是我很好奇这是否仍然与UIInterfaceOrientation相同 不,不是。有一种丑陋的方式很糟糕,需要单独的答案,因为它太大而无法评论。

以上是关于如何知道 iOS 8 中的当前 interfaceOrientation?的主要内容,如果未能解决你的问题,请参考以下文章

《iOS Human Interface Guidelines》——Page Control

iOS导航栏中的多个按钮通过Interface Builder?

《iOS Human Interface Guidelines》——Routing

《iOS Human Interface Guidelines》——Sound

如何知道当前执行代码的操作系统/平台(Android/iOS)

Interface Builder 中的未知类,从 xcode9 beta5 迁移到 xcode 8.3