iPad横向和纵向尺寸等级的不同布局

时间:2014-12-30 06:09:28

标签: ios iphone ipad uiinterfaceorientation size-classes

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

以纵向和横向在横向上垂直对齐2个视图

4 个答案:

答案 0 :(得分: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

     }
}

答案 1 :(得分:6)

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

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

答案 2 :(得分: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)

    }

答案 3 :(得分:0)

Swift 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)
}

我喜欢创建navigationController的自定义子类,然后将故事板初始导航控制器设置为该类。您也可以使用a 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)
    }
}

注意:您不应该按照docs

覆盖traitCollection
  

重要

     

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