美文网首页
Masonry拓展-AutoLayout与Frame的纠缠

Masonry拓展-AutoLayout与Frame的纠缠

作者: 天蓬大元 | 来源:发表于2018-01-29 12:31 被阅读0次

====1,当使用约束创建的控件时,在视图加载完成时(-viewDidAppear:)能正确获得控件的Frame;或者在约束完毕时调用-layoutIfNeeded方法也能立马获得控件的Frame

这是因为约束被设置之后它并不会立即对view作出改变,而是要等到layout时,才会对视图的尺寸进行修改。而layout通常是在视图已经加载到父视上时。所以我们如果在viewDidLoad中设置了约束,要等到viewDidAppear时view的尺寸才会真正改变。


====2,用约束创建控件,不要用Frame的方式去更改。

用约束创建一个控件,但是此时如果在某个方法里面手动使用Frame的方式修改控件的位置,
那么在手动旋转屏幕之后,控件的位置又会回到最初约束的状态,Frame方式失效。

总结:如果一个控件使用约束的方式布局,
那么它的同级(父视图相同)布局最好也是用相同的布局方式,
不要在这里同时混用Frame和约束(两者则其一使用)

====3,那么,如果需要既用约束布局,又用frame布局,如果能让它们很好的协作呢?

一个很好的解决办法是:把frame设置写到layoutSubviews中或者写到viewDidLayoutSubviews中即可。因为约束生效时view的center或者bounds就会被修改,center或者bounds被修改时layoutSubview,就会被调用,随后viewDidLayoutSubviews就回被调用。这个时候,设置约束的视图frame就不再是(0,0,0,0)了

====4,如果我们必须要将约束和frame写在同一方法中,写完约束就设置frame,而不是想把frame的设置写到layoutSubview中(比如我们设置好约束后马上就想根据约束的结果计算高度),那么我们还可以在设置完约束之后手动调用layoutIfNeeded方法,让视图立即layout,更新frame。在这之后就可以拿到设置约束的视图的尺寸了。

相关文章

网友评论

      本文标题:Masonry拓展-AutoLayout与Frame的纠缠

      本文链接:https://www.haomeiwen.com/subject/bmdxzxtx.html