1.约束创建的控件在-ViewDidAppear:可获得真是Frame,或者在手动调用-layoutIfNeeded方法后获得真是Frame
最初做开发的时候,经常使用的是用Frame做屏幕适配,包括后来的大屏幕等等是通过frame的比例来进行的适配,使用起来也算方便,后来苹果出了AutoLayout技术,以及随后的Masonry。
最初使用Masonry的时候,发现使用Masonry约束完的控件并没有Frame值(没调用layoutIfNeeded)方法,当时简单的了解一下自动布局的原理,简单说就是相对位置。而使用Frame布局是直接就是有布局的位置值的。
注:当使用约束创建的控件时,在视图加载完成时(-viewDidAppear:)能正确获得控件的Frame;或者在约束完毕时调用-layoutIfNeeded方法也能立马获得控件的Frame


2.StoryBoard加载控制器View的大小是屏幕的大小,Xib加载控制器View的大小是Xib的大小。
在StoryBoard里面加载的控制器的View的时候,在-viewDidLoad:方法里,打印View的Frame发现此时的Frame是屏幕的Bounds,是符合正常逻辑的,但是如果用控制器的View是xib初始化的,那么在-viewDidLoad:方法里面打印View的Frame发现此时的Frame是xib的大小,可以在-viewDidload:里先噶变View的大小,醉了。


3.用约束创建控件,不要用Frame的方式去更改。
用约束创建一个控件,但是此时如果在某个方法里面手动使用Frame的方式修改控件的位置,那么在手动旋转屏幕之后,控件的位置又会回到最初约束的状态,Frame方式失效。
总结:如果一个控件使用约束的方式布局,那么它的同级(父视图相同)布局最好也是用相同的布局方式,不要在这里同时混用Frame和约束(两者则其一使用)

网友评论
[self.picView setNeedsLayout];
self.cHeight.constant = [UIScreen mainScreen].bounds.size.width - 20;
[self.picView layoutIfNeeded];