如何在 Swift 中确定应用程序在拆分视图中的当前宽度?

How to to determinate in Swift the current width of the app when in Split View?

编辑:我有一个项目,上面有一排按钮。通常按钮在精简视图中为 5 个,在常规视图中为 6 个。当应用程序以 1/3 拆分视图运行时,我想删除一个按钮。如何确定应用程序的宽度?

我正在使用此代码确定应用程序在拆分视图(多任务处理)中的当前宽度:

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

        // works but it's deprecated:
        let currentWidth = UIScreen.mainScreen().applicationFrame.size.width

        print(currentWidth)
    }

它可以工作,但不幸的是 applicationFrame 在 iOS 9 中被弃用了,所以我试图用这个替换它:

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

        // gives you the width of the screen not the width of the app:
        let currentWidth = UIScreen.mainScreen().bounds.size.width

        print(currentWidth)
    }

问题是第一个语句为您提供了应用程序的有效宽度并且没问题,第二个语句为您提供了屏幕的宽度,因此您无法使用它来了解实际宽度处于拆分视图时的应用程序。

有人知道需要什么代码来替换这个已弃用的语句吗?

let currentWidth = UIScreen.mainScreen().applicationFrame.size.width // deprecated

你可以只获取父视图的大小。

let currentSize = self.view.bounds.width

这将 return 即使在拆分视图中也能准确显示宽度。

您可以执行类似这样的操作来确定是显示还是隐藏按钮。

let totalButtonWidth: Int
for b in self.collectionView.UIViews{
    let totalButtonWidth += b.frame.width + 20 //Where '20' is the gap between your buttons
} 
if (currentSize < totalButtonWidth){
    self.collectionView.subviews[self.collectionView.subviews.count].removeFromSuperview()
}else{
    self.collectionView.addSubview(buttonViewToAdd)
}

类似的东西,但我想你能理解。

@TheValyreanGroup 如果没有干预视图控制器处理大小,那么答案将有效。如果存在这种可能性,您应该可以使用 self.view.window.frame.size.width

感谢 TheValyreanGroup 和 David Berry 在 上的重播,我做了一个解决方案,可以在不使用 deprecate 语句的情况下响应界面更改 UIScreen.mainScreen().applicationFrame.size.width 我 post 它在这里用它的上下文更清楚地说明了问题所在和(肯定可以改进的)解决方案。请post任何您认为可以改进代码的建议和评论。

    // trigged when app opens and when other events occur
    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
        let a = self.view.bounds.width
        adaptInterface(Double(a))
    }

    // not trigged when app opens or opens in Split View, trigged when other changes occours
    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        adaptInterface(Double(size.width))
    }

    func isHorizontalSizeClassCompact () -> Bool {
        if (view.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact) {
            return true // Comapact
        } else {
            return false // Regular
        }
    }

    func adaptInterface(currentWidth: Double) {
        if isHorizontalSizeClassCompact() { // Compact
            // do what you need to do when sizeclass is Compact
            if currentWidth <= 375 {
                // do what you need when the width is the one of iPhone 6 in portrait or the one of the Split View in 1/3 of the screen
            } else {
                // do what you need when the width is bigger than the one of iPhone 6 in portrait or the one of the Split View in 1/3 of the screen
            }
        } else { // Regular
        // do what you need to do when sizeclass is Regular
        }
    }