使用Adaptive Layout
Device里选择Universal

AutoLayout基本布局和SizeClasses的个别调整

设置初始约束
为ImageView设置约束
约束1:水平居中

约束2:顶部置顶(含电池边距)

约束3:与下方view的垂直高度
按住imageview + ctrl 拖向下方的view,选择vertical spacing

点击image view,在右侧可以看见已经设定的约束,Edit vertical spacing to 20

约束4:与父视图的关系-高度40%
ctrl + 按住image view 拖向view,设定其与父视图的关系


为view设置约束
左 + 中 + 下

ImageSet为项目添加相关图片

双击后为图片组更名

更新frame让约束生效
橘红色的是可以调整的,红色的是有问题的

预览功能查看不同设备屏幕


为label1设定约束
水平居中

顶部置顶

为label2设定约束
水平居中

下部间隔

更新frame让约束生效

Size Classes的使用
两种尺寸组合表达所有设备: Regular and Compact

构建iPhone landscape size Class
点击下方的”W any H any”


重设image view约束(仅在该sizeClass)
卸载所有约束
点击image view,在右侧删除所有约束 - (只是在这个size class里uninstalling )


将所有约束删除

新约束1:垂直居中

新约束2:左间隔10

新约束3:与父视图的宽度比例为40%
ctrl拖动到父视图view,设置宽度比例


重设TextContainer约束(仅在该sizeClass)
卸载约束

设定与父视图的顶部间距和宽度比例



更新Frame

在故事板中设置自适应字体
回到Any界面(w+h)

设置某个size class类别下的字体
点击字体旁的 + 按钮


设置字体能自动缩小50%

设置label与父视图的约束
避免标签的尺寸超出父视图

设置适配不同设备的图片
点击图片组,分别选择右侧的 iPhone , iPad。拖入图片,将针对不同设备采用不同的图片

表格单元格的自我调整(代码略)
效果图

单元格的设定
style为custom,selection为none

imageView约束设定(铺满整个cell)

Label约束设定
Press ctrl to drag to contentView and press shift to select all


场景布局与实际布局不符合,就会出现橘红色的标注

Label字体/背景色/透明度设定

设置单元格高度解决冲突
点击单元格,将高度拖至120

更新frame

设置table cell之间的分割符

在Controller中必须添加的两行代码
ViewController
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 100
}
总结
- 必须要由tableView来决定表格的宽度
- Autolayout必须约束高度,并且不能有冲突。比如该例子中的label。需要手动调整高度
- 两行代码
安装集合视图(代码略)
效果图

安装ContainerView并添加约束

ContainerView会自动创建ViewController
本案例不需要,可以删除

Container内嵌集合视图 (代码略)
Press ctrl to drag to collectionView ,选择 Embed


重新设定Label约束
删除顶部约束

与Container的顶部垂直距离为0


在iPhone横屏中去除集合视图
效果图

设定iPhone横屏size class

在该size class中卸载container
cmd + Delete = 卸载

卸载container view的约束(右侧删除)

重设label约束
显示Label所有约束(含卸载)
点击All

重设当前sizeClass约束
点击 + 号,选择size class ,然后install



iPhone竖屏上去除集合视图

DetailViewController
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.configureView()
provideDataToChildViewControllers()
navigationItem.leftItemsSupplementBackButton = true
navigationItem.hidesBackButton = false
configureTraitOverrideForSize(view.bounds.size)
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
configureTraitOverrideForSize(size)
}
private func configureTraitOverrideForSize(size:CGSize) {
var traitOverride: UITraitCollection?
if size.height < 1000 {
traitOverride = UITraitCollection(verticalSizeClass: .Compact)
}
for vc in childViewControllers {
setOverrideTraitCollection(traitOverride, forChildViewController: vc)
}
}
为SizeClass配置相关图片
效果图
如图,集合视图和顶部所使用的图片不一样

在ImageAsset中构建size class
- 选择右侧width – Any&Compact
- Universal打勾,对应拖入图片。 * 代表 any, - 代表compact , + 代表regular
- 右侧取消iPhone,iPad

相关代码
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
configureView()
let traitOverride = UITraitCollection(horizontalSizeClass: .Compact)
for vc in childViewControllers {
setOverrideTraitCollection(traitOverride, forChildViewController: vc)
}
}
隐藏导航栏
效果图
如图,点击屏幕将导航栏隐藏


UIStoryboard中设置NavigationBar
选中NavigationController,在右侧hide bar打勾:“on tap” + “when vertically compact”

定制横竖屏的文字
效果图
横屏文字较小,竖屏文字较大


相关代码
private func prepareNavigationBarAppearance() {
let font = UIFont(name: "HelveticaNeue-Light", size: 30)!
let regularVertical = UITraitCollection(verticalSizeClass: .Regular)
UINavigationBar.appearanceForTraitCollection(regularVertical).titleTextAttributes = [NSFontAttributeName: font]
let compactVertical = UITraitCollection(verticalSizeClass: .Compact)
UINavigationBar.appearanceForTraitCollection(compactVertical).titleTextAttributes = [NSFontAttributeName: font.fontWithSize(20)]
}
设定某UI元素height或width的约束
ctrl + drag 在该元素内部拖动
