在iOS 8和Xcode 6中,我们现在可以通过故事板选择屏幕尺寸网格来选择大小类,以便为不同的屏幕尺寸选择布局格式。
我发现这非常有用,因为它允许我设置基本约束,然后针对每个屏幕尺寸设置独特的约束。
我的问题是,是否可以通过编程实现这一点?我像平常一样创建我的NSLayoutConstraint
,但我需要能够为不同的屏幕尺寸指定不同的约束。
在iOS 8和Xcode 6中,我们现在可以通过故事板选择屏幕尺寸网格来选择大小类,以便为不同的屏幕尺寸选择布局格式。
我发现这非常有用,因为它允许我设置基本约束,然后针对每个屏幕尺寸设置独特的约束。
我的问题是,是否可以通过编程实现这一点?我像平常一样创建我的NSLayoutConstraint
,但我需要能够为不同的屏幕尺寸指定不同的约束。
iOS 8 引入了 active
属性到 NSLayoutConstraint
上。它允许你激活或取消一个约束条件。同时还有方法可以批量激活/取消多个约束条件。
+ (void)activateConstraints:(NSArray *)constraints
+ (void)deactivateConstraints:(NSArray *)constraints
willTransitionToTraitCollection
中激活/停用所需的约束集。这可能有些令人困惑并且在文档中很难找到,因为“size class”实际上不像NSObject一样是一个“Class”。它们真正被定义在一个枚举/typedef中,叫做:UIUserInterfaceSizeClass。
获取视图的水平和垂直大小类的方法是使用UITraitCollection。
UITraitCollection的类/类型方法允许您基于特定的显示比例(例如retina或非retina)、从其他trait collection数组、使用UI风格(iPad/iPhone)或特定的水平和垂直选项(紧凑、常规)创建一个trait collection,但老实说我还不确定如何使用它...
这个问题讨论了在traitCollection更改时使用willTransitionToTraitCollection(newCollection: UITraitCollection!, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!)
更新约束的方法。
你说得对,UITraitCollection及其属性都是只读的,但显然你可以出于某种原因创建一个新集合,并处理当traitCollection更改时的布局变化。
这个之前的问题非常类似,并链接到了一个关于使用自适应布局的苹果文章。还要查看WWDC视频“使用UIKit构建自适应应用程序”。
class MasterNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
if (self.traitCollection.userInterfaceIdiom != .Phone) {
let newTraitCollection = UITraitCollection(horizontalSizeClass: .Regular)
self.setOverrideTraitCollection(newTraitCollection, forChildViewController: self.topViewController)
}
}
}
NSLayoutConstraint
或类似的方式编程指定大小类的话就好了。 - Josh Kahane