以编程方式设置AutoLayout大小类?

时间:2014-10-14 14:15:32

标签: objective-c ios8 autolayout nslayoutconstraint

使用iOS 8和Xcode 6,在故事板中,我们现在拥有屏幕尺寸网格,让我们选择尺寸等级。您可以在哪里为不同的屏幕尺寸选择布局格式。

我发现这非常有用,因为它允许我为每个屏幕尺寸设置基本约束,然后设置唯一的限制。

我的问题是,你能以编程方式执行此操作吗?我正常创建NSLayoutConstraint,但我需要能够为不同的屏幕尺寸指定不同的约束。

3 个答案:

答案 0 :(得分:12)

iOS 8在NSLayoutConstraint上引入了active属性。它允许您激活或停用约束。还有激活/停用多个约束的方法。

+ (void)activateConstraints:(NSArray *)constraints
+ (void)deactivateConstraints:(NSArray *)constraints
  • 以编程方式创建约束时,将约束保留在数组中。
  • 为您需要的每个布局创建一个数组。
  • willTransitionToTraitCollection
  • 中激活/停用所需的任何约束集

答案 1 :(得分:1)

这有点令人困惑&很难在文档中找到,因为“大小类”实际上并不像NSObject那样是“类”。它们实际上是在名为UIUserInterfaceSizeClass

的枚举/ typedef中定义的

获得水平和水平的方法视图的垂直大小类使用UITraitCollection

UITraitCollection的类/类型方法允许您根据特定的显示比例(例如视网膜或非视网膜),从其他特征集合的数组创建一个,具有UI惯用语(iPad / iPhone),或特定的水平&垂直选项(紧凑,规则),但说实话我还不确定你如何使用它...

This question讨论了当traitCollection发生变化时使用willTransitionToTraitCollection(newCollection: UITraitCollection!, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!)

更新约束

你是对的,UITraitCollection及其属性都是只读的,但显然你可以出于某种原因创建一个新的集合,并在traitCollection改变时处理布局的变化。

This previous question非常相似&链接到有关使用Adaptive Layout的Apple文章。另请查看WWDC视频“使用UIKit构建自适应应用程序”。

答案 2 :(得分:1)

要回答您的问题,您可以通过编程方式设置大小类,但是,这有点痛苦。您必须从父视图控制器调用“setOverrideTraitCollection”,而不是您实际希望将特征更改为的那个。

在我的情况下,我想将iPad上的分割视图控制器的Master VC更改为与iPhone上的不同,但是,默认情况下它们都设置为Compact width / Regular height。因此,我将Master的导航控制器子类化,并添加了代码,将Master的特征设置为常规宽度,而不是iPhone。

Swift代码:

class MasterNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        if (self.traitCollection.userInterfaceIdiom != .Phone) {
            let newTraitCollection = UITraitCollection(horizontalSizeClass: .Regular)
            self.setOverrideTraitCollection(newTraitCollection, forChildViewController: self.topViewController)
        }
    }

} 

我希望这有助于寻找类似解决方案的人。