首页 文章

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

提问于
浏览
24

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

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
    
         }
    }
    
  • 5

    看起来苹果打算将两种iPad方向都视为一样 - 但正如我们中的许多人所发现的那样,有非常合理的设计理由想要改变iPad Portrait与iPad Landscape的UI布局 .

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

  • 6

    对于 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)
    }
    

    在横向模式下,它将使用 wRhC 而不是 wRhR 用于iPad设备 . 将此代码放入基本视图控制器,即此规则适用于此规则所呈现的所有控制器 . 您可以在此处添加任何其他条件...例如,如果您希望此规则仅适用于特定视图控制器,则 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)
    
        }
    
  • 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属性 . 不要覆盖它 . 不提供自定义实现 .

相关问题