有三种方式来代码创建约束,可以使用layout anchors,nslayoutconstraint类或者使用Visual Format语言。
关于UIView的translatesAutoresizingMaskIntoConstraints属性
最近在对AutoLayout的学习中发现,很多人似乎对translatesAutoresizingMaskIntoConstraints的误解非常大,很多时候遇到问题总有人会在下面回答到:把translatesAutoresizingMaskIntoConstraints设置成false就可以解决问题。。。实际上并没有什么用。
那么这个属性到底是做什么的呢?
其实这个属性的命名已经把这个属性的功能解释的非常清楚了。
除了AutoLayout,AutoresizingMask也是一种布局方式。这个想必大家都有了解。默认情况下,translatesAutoresizingMaskIntoConstraints = true , 此时视图的AutoresizingMask会被转换成对应效果的约束。这样很可能就会和我们手动添加的其它约束有冲突。此属性设置成false时,AutoresizingMask就不会变成约束。也就是说 当前 视图的 AutoresizingMask失效了。
那我们什么时候需要设置这个属性呢?
当我们用代码添加视图时,视图的translatesAutoresizingMaskIntoConstraints属性默认为true,可是AutoresizingMask属性默认会被设置成.None。也就是说如果我们不去动AutoresizingMask,那么AutoresizingMask就不会对约束产生影响。
当我们使用interface builder添加视图时,AutoresizingMask虽然会被设置成非.None,但是translatesAutoresizingMaskIntoConstraints默认被设置成了false。所以也不会有冲突。
反而有的视图是靠AutoresizingMask布局的,当我们修改了translatesAutoresizingMaskIntoConstraints后会让视图失去约束,走投无路。例如我自定义转场时就遇到了这样的问题,转场后的视图并不在视图的正中间。
所以,这个属性,基本上我们也不用设置它。
AutoLayout与Frame篇
在使用AutoLayout的时候你可能也会同时也会用到frame,比如需要用到layer的时候。
那么你可能会遇到这种情况,想让layer的尺寸是由其它视图尺寸设定的,而这个视图又是由约束控制布局的。如果将layer的初始化与view的初始化放在一个方法中,类似于viewDidLoad的方法中
1 |
|
那么很可能最终layer的宽度是0。
这是因为约束被设置之后它并不会立即对view作出改变,而是要等到layout时,才会对视图的尺寸进行修改。而layout通常是在视图已经加载到父视上时。
所以我们如果在viewDidLoad中设置了约束,要等到viewDidAppear时view的尺寸才会真正改变。
那么,如果需要既用约束布局,又用frame布局,如果能让它们很好的协作呢?
一个很好的解决办法是:吧frame设置写到layoutSubviews中或者写到viewDidLayoutSubviews中即可。因为约束生效时view的center或者bounds就会被修改,center或者bounds被修改时layoutSubview,就会被调用,随后viewDidLayoutSubviews就回被调用。这个时候,设置约束的视图frame就不再是(0,0,0,0)了
如果我们必须要将约束和frame写在同一方法中,写完约束就设置frame,而不是想把frame的设置写到layoutSubview中(比如我们设置好约束后马上就想根据约束的结果计算高度),那么我们还可以在设置完约束之后手动调用layoutIfNeeded方法,让视图立即layout,更新frame。在这之后就可以拿到设置约束的视图的尺寸了。
AutoLayout动画篇
这篇的内容非常简单,就是介绍约束布局的视图如何进行位移动画。
如果我们的一个视图是通过设置frame来布局的,那么我们在位移动画时直接改变frame就可以了。很简单。
可是在约束布局的视图中,设置frame这个办法就无效了。那我们怎么办?
网上有很多人的办法就是:拿到想要做动画的约束,在动画之前对约束进行修改,在动画的block中调用setNeedsLayout方法。
这个方法我觉得非常的麻烦,为了方便地拿到约束,我们通常还需要把约束设置成属性,动画一多那岂不就是完蛋了?
一种更好的方法就是设置视图的transform属性。
比如我想要让视图做一个x轴+50的位移,
1 |
|
这样设置即可。CGAffineTransformMakeTranslation这个方法就是设置位置。
AutoLayout比例设置
如果我们用autoLayout想把一个视图的中心设置到屏幕横向和纵向的1/4处:
1 2 3 4 |
|
这就相当于
1 |
|
那么AutoLayout中的倍数,具体表示什么呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|