iOS AutoLayout还能够这样玩

Auto Layout


网上关于Auto Layout的文章繁多, 可是总以为有些内容并无说清楚。因此在这篇博文,我将经过一个demo演示Auto Layout中几个容易被忽略,可是又至关重要的概念html


demo效果

demo效果

demo 中要经过约束要实现的效果以下:bash

  1. backgroundView width>=60;
  2. backgroundView的width随着Label中内容的增长而增长
  3. backgroundView与其superView的margin>=30。也就是当Label的内容过长时,会显示出省略号。

概念

要实现demo 中的效果前,须要知道下面的几个概念:app

1, Constraint equalities(暂且叫作约束等式):这个就是常见的约束类型。再也不赘述,举几个例子:布局

Red.top = 1.0 * Superview.top + 20.0
Superview.bottom = 1.0 * Red.bottom + 20.0
Red.top = 1.0 * Blue.top + 0.0
Red.bottom = 1.0 * Blue.bottom + 0.0
复制代码

2, Constraint Inequalities(暂且叫作约束不等式):它指定一个区域而不是一个确切的值。ui

// Setting the minimum width
View.width >= 0.0 * NotAnAttribute + 40.0
 
// Setting the maximum width
View.width <= 0.0 * NotAnAttribute + 280.0
复制代码

3,Constraint Priorities约束优先级 : 约束优级是一个0-1000的数值。当两个约束出现冲突时,优先级高的约束将保留,优先级低的约束失效。spa

4,Intrinsic Content Size内在内容size: 有些view 能够根据其内容设定其size。好比说UILabel,UIButton等,他们的size恰好可以容纳其内容支持Intrinsic Content Size的view以下: 3d

Intrinsic Content Size

5, content-hugging priorities 抗拉伸优先级(默认250) :这个优先级与 Intrinsic Content Size相关。假如一个Label的Intrinsic Content Size width=50, 如今添加一个width=60的约束(默认优先级是1000)如今Label就会拉伸 。若是将 约束width=60的优先级设置成小于250的值,Label就不会被拉伸。
6, compression-resistance priorities 抗压缩优先级(默认750):这个优先级也与 Intrinsic Content Size相关。假如一个Label的Intrinsic Content Size width=50, 如今添加一个width=40的约束(默认优先级是1000)如今Label就会压缩 。若是将 约束width=40的优先级设置成小于750的值,Label就不会被压缩。 能够看出 content-hugging prioritiescompression-resistance priorities用于抵抗其余约束对viewIntrinsic Content Size的改变。code

###实战 介绍完上面的概念,让咱们使用他们完成上面demo效果。cdn

1, 新建工程,打开storyboard。添加backgroundView(继承自UIView), 设置背景颜色为灰色并添加 水平居中和垂直居中约束。此时会出现约束错误,这是由于这个backgroundView只设置了position,没有设置size。 没必要担忧,一会就可解决这个问题;htm

约束以下:

pic1

pic2
2, 在backgroundView中添加一个 ActivityIndicatorView 和 Label。(下面还添加了一个button, 当点击下面的button时,label中的内容会增长)

view层级关系以下:

pic3

添加下列约束:

pic4
pic5

此时的约束没有任何错误了显示效果以下:

pic6

3, 此时经过给Label添加文字,backgroundView也会相应增大(只分析水平方向)。为何增大? 这是由于Label的text决定Intrinsic Content Size的大小, text增多,Intrinsic Content Size相应增长。Label与backgroundView 的margin为10。因此根据这一系列的关系致使了 给Label添加文字,backgroundView也会相应增大。

pic7

4, 如今有个问题, 当label中的文字太多时,backgroundView的宽度会超出其父view范围,这显然不太好。添加一个约束使backgroundView与其父view之间有一个最小的margin。 这时就要使用约束不等式了。约束不等式能够指定一个范围而不是一个确切的数值。看下面的例子。

pic8

添加以下约束, 这样backgroundView和superView 之间的margin最小是30。当label中的内容过长时,内容就会被压缩。But Why?

pic9
pic10

5 , backgroundView 的width随Label中内容的增长而增长。 当backgroundView 与其superView 的margin=30后,再增长 backgroundView 的width就会产生约束冲突了(与以前设置的 ‘backgroundView和superView 之间的margin最小是30’ 这条约束产生冲突 )。那么stroyboard是如何解决冲突的那? 对,就是优先级。 ‘backgroundView和superView 之间的margin最小是30’这条约束的优先级时1000, 是最大优先级。 Label 的抗压缩优先级默认750,1000>750, Label这能被压缩了(内容省略了一部分)。若是你将这两个优先级大小交换一下,backgroundView与superView 就之间不会出现margin了。

6, 当label中有一个字母是, 效果是这样的。 好丑。。。。

pic11

咱们给backgroundView设置一个最小width约束。 咱们设置backgroundView的width =60约束, 并设置优先级996。(固然,你也能够使用width >=60这样的约束。这里为了演示优先级) 如今的效果是这个样子的:

pic12

又出问题了。。。 虽然backgroundView width=60确实起做用了,可是Label内容增长时backgroundView的width并无增长。这仍是优先级的问题。Label 的抗压缩优先级是750, backgroundView width=60的优先级时996,996>750, 固然会出问题了。 如今只需让 Label的抗压缩优先级大于backgroundView width=60的优先级就能够了 。

7, 关于抗拉伸优先级,没想到很好的例子,就不演示了。

结语

一种布局效果能经过多种约束方式实现出来,关键是思路清晰,一步一步的来。 参考资料,固然是 官网了。但愿对你有帮助,若有帮助就给个喜欢吧。

相关文章
相关标签/搜索