NOTE:现在开发周期越来越快,而且Apple也推崇用AutoLayout来进行开发,自己的项目也慢慢从纯代码过度到了IB,找了本书看看,记录下学习的点点滴滴
本次主要介绍下 instrinsicContentSize 压缩阻力 内容吸附
1. instrinsicContentSize
使用Autolayout时,视图的内容在其布局中的重要性和约束不相上下。视图的内容通过每个视图的instrinsicContentSize属性进行表达,instrinsic本身的意思就是本质的固有的,顾名思义,该属性表达了数据未经过压缩或者裁剪的情况下表达视图全部内容所需要的最小空间,源于每个视图所呈现出来的自然属性。
例如
以下就是打印信息,根据箭头所示,无论IMageView的Frame怎么变化,其instrinsicContentSize的属性值不变
通过视图的内在内容的大小,AutoLayout将视图的框架尽可能地与自然内容相匹配。无歧义的布局通常需要给坐标轴设置两个属性,那么当视图有一个内在内容大小的时候,则只需要设置两个属性的一个。例如把还有文本的Label空间放置在self.view的center,它的布局僵尸无歧义的布局。内在内容(CGSize)和视图位子(CGPoint)共同构成了充分指定的布局。
当改变了试图的内在内容的时候,需要调用invalidateInstrinsicContentSize,如下图所示只是设置两边,然后给一个内容,就是无歧义的
当我们切换的时候
看到下边打印,instrinsicContenSize变化了,而且系统自动调用了invalidateInstrinsicContentSize进行重新的布局计算
// 以下就是文档的简单说明
- (void)invalidateIntrinsicContentSizeNS_AVAILABLE_IOS(6_0);// call this when something changes that affects the intrinsicContentSize. Otherwise UIKit won't notice that it changed.
2.压缩阻力
顾名思义,就是视图保护其内容的方式,压缩阻力高的视图能够抵抗收缩,不允许内容被裁减
先看两个图,一个是被压缩了,一个没有被压缩
根据以下图片可以看到控件Content Compression Resistance Priority的属性值,默认貌似都是750,我这里修改成了 500
然后我们看看约束的Priority,默认是1000,这里我打算写成 499,那么这里相对于控件上边的500,优先级要低,所以结论是,控件的压缩阻力高,约束低,所以不会被压缩,就是左边那个控件不会被裁减,反之,就是上边被裁减的样子,但是一般情况下,约束的优先级是1000,控件默认是750,AutoLayout经常遇到这样两相互矛盾的东西,但是只有一个请求会被执行,满足优先级高的那个,一般是约束优先,但是人为改动的话情况就会随之变化
注意:这里的虚线表示不是绝对1000至高无上的以它为主了,代表可以被超越,可以变化
3.内容吸附
该属性和压缩阻力一样的原理,描述了视图将框架与其内容的自然大小匹配的意思。较高的吸附优先级可以防止视图比它呈现的内容扩大太多。较低的可能允许视图伸展,使内容孤立在中间,下图左:吸附力弱,有图吸附力强(强代表大于约束的优先级)
如图我吸附改掉的属性值
以下是约束
这里约束从1000改为750,上边把控件的吸附先改为 749,那么还是约束高
如果把吸附改为751或者更大,那么约束优先级就低了
总结:默认情况下吸附和抗压的约束都是1000的,如果需要改变其优先级,就要先把约束的优先级从1000改为更小,以便有更大的优先级和他比较,改完之后的约束是虚线的,代表可以被超越,可以被优先级覆盖