优秀工程师-layoutSubviews相关方法

来源:互联网 发布:java web嵌入式 编辑:程序博客网 时间:2024/06/06 02:42

一、 与之相关的方法

- (void)layoutSubviews

- (void)layoutIfNeeded

- (void)setNeedsLayout


1.layoutSubviews 重新布局  这个方法是对自己的子控件进行重新布局

一般在这个方法里,我们设置子视图的frame,切记要调用其父类方法[super  layoutSubviews]

一般的情况下是在最开始的时候调用的,我也碰到过一次调用后布局混乱的情况。可能是自己没有设置好吧。


2.这个方法什么时候被调用

这个方法在init的时候不会调用,但是当设置frame的时候会调用。当子视图变化的时候也会调用。所以在初始化方法中设置frame一般是不准确的。要在这个方法中设置frame。因为在设置自身frame的时候会调用自身的这个方法,所以如果在这个方法中设置了自身的frame,就会以这个方法中设置的frame为准,造成混乱。所以创建控件的时候到底改怎么做,这也是很重要的事情。


3.layoutIfNeeded 和 setNeedsLayout

这两个方法不是很明白,看别人说的是setNeedsLayout是标记重新布局,也就是调用自身的layoutSubviews进行重新布局,但是由于是异步执行的,所以系统会在不定点的时候调用。如果想要立即更新布局,要调用setNeedsLayout方法刷新布局。也就是说setNeedsLayout方法是如果有标记需要重新布局的情况下就调用layoutSubviews方法,如果没有标记的话就不会调用。但是我不知道的是,是不是仅仅只有setNeedsLayout方法进行标记。如果仅仅是该方法能标记的话,那么这两个方法就是配套使用的。但是,看黑马的视频的时候,说的是调用layoutIfNeeded的时候,系统会自行判断是不是需要布局,如果需要的话就布局,如果不需要就不会布局。哪个方法是该表了lable的字体,然后重新布局。

但是我一直很纳闷为什么不直接调用layoutSubviews,而弄的如此麻烦?原来是因为官方这么说的,该死的官方呀。



二:应该如何布局视图

1.我感觉怎么布局自己的子视图这个问题应该考虑的是怎样的面向对象的思想,也就是我对面向对象的一点理解。

面向对象,就是把一个整体分为若干块去完成,然后把若干块连接起来。这就是面向对象。

而其中controller就是起着连接的作用,它控制着视图怎么展现。视图和数据是分不开的。因为视图是数据的直接展现。


完全的面对对象的话,那就是这个东西应该这么布局,我就这么布局,把frame都设置好。不需要控制器操心了。你只需要初始化一个实例就可以用我了。这样控制器就显得比较简洁了。慢慢的想象,如果这样的话,那么就没有办法做动画了,因为自身的frame都被自己设置好了,别人根本不能修改。就像输入框的高一样,别人根本无法更改。


2. 所以我感觉正确的布局方法就是自己管理自己子视图的布局。而将自身的frame交给父视图去管理。但是由于初学的原因。并没有完整的 frame数据,所以有时总会因为fram不知道设置为多少,而去纠结会不会设置的不对或者设置的过大超出父视图给的界限。或者过小的话造成布局不严密的情况。而去质疑到底应该怎么去做。希望以后不要再有这样的想法。


3.对于多层次的视图构建。应该是fram和cell分离的。因为如果写在同一个文件下的话,会造成代码量太多影响阅读。


* 首先要确定视图的层次,创建好相对应的文件。frame和cell应该一一对应,避免造成不必要的困扰。

* 然后再在frame文件里传入数据模型,根据数据计算frame。最好写一个父类,把数据模型和自身的frame放在其中。

在每个文件的模型的set方法中计算出子视图以及自身的frame。子视图的frame如果没有孙视图的话就是cgrect。如果有的话就是model模型。在.h文件中给出子视图的frame模型。其实.m文件中也就一个set方法;

* 在cell文件中,.h文件中要创建与自己对应的frame模型。在.m文件的初始化方法中创建好视图,然后再set方法中完成对视图frame以及数据的设置。当然首先要对自身的frame进行赋值。然后再传递子视图的模型。开始的时候也就是因为这个地方,对什么时候设置frame越来越迷糊。现在想想其实,当打点调用也就是传递frame模型的时候就已经对子视图的frame进行了设置,为什么会写在自己的文件中,因为是set方法,打点调用的这个方法进行赋值的。其实也就是在本文件中设置其子视图的frame。

* 这个时候frame是在set方法中设定的,并不是在layoutsubviews中。有一阵子也在纠结这个问题。嗯,然后试了试。没有办法在layoutsubviews中设置,因为并没有frame模型。纠结过这样为什么不会造成布局混乱,而在init方法中会。可能这就相当于打点调用fram方法吧。具体也不是很清楚呀

原创粉丝点击