前行文
autoLayout自动布局在ios开发中有其不可比拟的优势,简化的代码,让后期维护变得更简单。这里不做autoLayout与autoResize的优势分析,但是在开发过程中如果不注意就会遇到autoLayout意想不到的坑,下面稍微总结一下,
1、关于frame
用autoLayout和autoresize布局的视图,在UI刷新后的frame上,是相同的,但是在没有刷新前是不同的。换句话说,用autoLayout布局后,如果用代码更改其frame的话,在本次UI刷新时会更新成你所设计的frame,然后在下一次UI刷新完成的时候会变回你在storyboard里所约束布局的样子,这种情况在使用tableview、collectionview的reloadData或textFiled时应有所注意,而归根究底,是因为autoLayout限制的frame问题。
为什么会是这样,我们我们说一下controller的生命周期,init—初始化程序viewDidLoad—加载视图viewWillAppear,这是VC对象的视图即将加入窗口时调用;viewDidApper,这是VC对象的视图已经加入到窗口时调用。而如果用autoLayout布局时在viewDidLoad和viewWillAppear时,获取到的是在storyboard里的frame,而在wiewDidAppear中才是正确的frame。但是利用autoresizing是都可以获取到在storyboard约束的frame的。所以在一点需要注意。
2、关于特殊坑
那么,假如说我们设计好了视图,在代码中需要获取其frame,对于autoLayout的要在wiewDidAppear之后获取,而用autoresing的方法,可以在任何时候获取。那么我们如果需要修改frame该怎么办,这里就是特殊性之所在。
1、所更改frame的视图为单一视图或者视图里没有变化的元素,两种自动布局的方法都可以用代码更改frame。2、所更改frame的视图不为单一视图,在视图变化中有例如textFiled,label的变化。则会产生问题,什么问题,代码控制不了用autoLayout的frame,
labelView.frame=CGRectMake(0,200,self.view.frame.size.width,100); _showLable.text = @"你的名字";
就像这样,用autoLayout布局的labelView里有个label,在改变其frame时同时改变label的值,就会出现label变化但frame不变化的情况,类似的如改变textFiled的。但是如果用autoresing方法布局,就不会出现这种情况。怎么办,解决办法就是用修改约束线的方法更改用autoLayout布局的labelView里有个可变label的frame的方法。
_viewLable
.constant =
100.f
_showLable
.text = @
"你的名字"
总之,如何避免所说的布局的坑,1、注意frame的调用方法 2、尽量不修改frame,若非要修改,那么用autoresing的布局方法,可以代码设置frame,用autoLayout的方法在所涉及视图没有变化的情况下可以代码设置frame的方式修改,关键点 如果所涉及的视图里面有可变的组件,如label的值,也就是label的布局依赖于要改变的frame的视图,那么就用代码设置frame的方法是设置不了的,用约束线的方法。
后续,可以试一下以下设置1、分别用autoLayout布局基于self.view的UIViewTextFiled和基于self.view一个子view的UIViewTextFiled,然后用代码更新其frame看看有什么相同或不同。欢迎反馈探索。
转载请注明原文地址: https://ju.6miu.com/read-305.html