====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)了
网友评论