使用iOS 8和Xcode 6,在故事板中,我们现在拥有屏幕尺寸网格,让我们选择尺寸等级。您可以在哪里为不同的屏幕尺寸选择布局格式。
我发现这非常有用,因为它允许我为每个屏幕尺寸设置基本约束,然后设置唯一的限制。
我的问题是,你能以编程方式执行此操作吗?我正常创建NSLayoutConstraint
,但我需要能够为不同的屏幕尺寸指定不同的约束。
答案 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)
}
}
}
我希望这有助于寻找类似解决方案的人。