26

如何使用 Size 类设计具有不同布局的 iPad 横向和纵​​向屏幕。我只能找到两个方向的 w-regular 和 h-regular。示例:我需要使用 Size Class 纵向对齐 2 个视图,横向对齐 2 个视图

4

4 回答 4

6

最后我找到了一个解决方案:

if traitCollection.verticalSizeClass == .Regular && traitCollection.horizontalSizeClass == .Regular {

     var orientation:UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation;
     if orientation == UIInterfaceOrientation.LandscapeLeft || orientation == UIInterfaceOrientation.LandscapeRight {
            // orientation is landscape


     }  else {
            // orientation is portrait

     }
}
于 2015-01-15T21:40:22.100 回答
6

Apple 似乎打算将两种 iPad 方向视为相同 - 但正如我们中的许多人所发现的那样,想要改变 iPad 纵向与 iPad 横向的 UI 布局是非常合理的设计理由。

但是,请参阅此答案以了解另一种调整大小类以满足我们需要的方法: https ://stackoverflow.com/a/28268200/4517929

于 2015-02-06T06:50:38.020 回答
5

对于Swift 3,它看起来像这样:

override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
    if UI_USER_INTERFACE_IDIOM() == .pad &&
        view.bounds.width > view.bounds.height {

        let collections = [UITraitCollection(horizontalSizeClass: .regular),
                           UITraitCollection(verticalSizeClass: .compact)]
        return UITraitCollection(traitsFrom: collections)

    }

    return super.overrideTraitCollection(forChildViewController: childViewController)
}

它将在横向模式下对 iPad 设备使用wRhC而不是wRhR 。将此代码放入您的基本视图控制器,即此规则将适用于该控制器提供的所有控制器。您可以在此处添加任何附加条件...例如,如果您希望此规则仅适用于特定视图控制器,则您的if运算符将如下所示:

    if UI_USER_INTERFACE_IDIOM() == .pad &&
        childViewController is YourSpecificViewController &&
        view.bounds.width > view.bounds.height {

        let collections = [UITraitCollection(horizontalSizeClass: .regular),
                           UITraitCollection(verticalSizeClass: .compact)]
        return UITraitCollection(traitsFrom: collections)

    }
于 2016-09-23T07:55:23.690 回答
2

斯威夫特 4

override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
    if UIDevice.current.userInterfaceIdiom == .pad && UIDevice.current.orientation.isLandscape {
        return UITraitCollection(traitsFrom:[UITraitCollection(verticalSizeClass: .compact), UITraitCollection(horizontalSizeClass: .regular)])
    }
    return super.overrideTraitCollection(forChildViewController: childViewController)
}

我喜欢创建一个导航控制器的自定义子类,然后为该类设置一个故事板初始导航控制器。你也可以用ViewController做类似的事情。

例子:

import UIKit

class NavigationControllerWithTraitOverride: UINavigationController {
    
    // If you make a navigationController a member of this class the descendentVCs of that navigationController will have their trait collection overridden with compact vertical size class if the user is on an iPad and the device is horizontal.
    
    override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? {
        if UIDevice.current.userInterfaceIdiom == .pad && UIDevice.current.orientation.isLandscape {
            return UITraitCollection(traitsFrom:[UITraitCollection(verticalSizeClass: .compact), UITraitCollection(horizontalSizeClass: .regular)])
        }
        return super.overrideTraitCollection(forChildViewController: childViewController)
    }
}

注意:您不应该根据文档覆盖 traitCollection

重要的

直接使用 traitCollection 属性。不要覆盖它。不要提供自定义实现。

于 2018-04-20T19:32:29.367 回答