算好高度以后,就腾出地方了,就把中间控件放到对应的位置上,如何放呢?
1.调整frame
2.设置约束
由于高度是一直手动算的,没利用约束,所以调整frame
在哪里设置这个frame呢?
在cell的m文件中layOutSubViews
为什么要在这个方法中呢?
因为中间控件属于cell的子控件,cell需要布局子控件,所以在这个方法中是最靠谱的
如何写?
通过属性拿到中间控件
当cell要出现在眼前,比如最顶部的cell,拖上去又拖回来,一定会调用cellForRow,只要cell显示到屏幕上,一定会调用,从缓存池中取出cell,并且一定会传模型给cell,在cell的set模型方法中就会不停的创建中间控件,并且重复的给它加上中间控件,这样同一个cell加的中间控件酒会越来越多,从面包层中也可以发现叠加的越来越多
如何解决这个问题呢?
保证只加一次,马上想到懒加载,要素:搞一个属性,搞一个属性的get方法,在懒加载方法中就把这个控件加进去
-(ZZTopicVoiceView *)voiceView
{
if (!_voiceView) {
ZZTopicVoiceView *voiceView = [ZZTopicVoiceView zz_ViewFroomXib];
[self.contentView addSubview:voiceView];
_voiceView = voiceView;
}
return _voiceView;
}
加哪个子控件,就重写哪个子控件属性的get方法
在layoutSubViews中设置子控件frame
变成模型属性,然后利用模型把它带过去
在模型里面调用cellHeight的get方法才会去算它的frame,并且将算好的frame拿到cell类中的layoutSubViews中去设置,意思是把中间控件的frame算好以后传到cell类中去给中间控件设置frame,这里有一个疑问,万一是先调用layoutSubViews,再调用cellHeight方法,那这样就会出问题了,因为此时frame是没有值的,这里可以明确,layoutSubViews一定是放到最后才调用的
cell最后显示出来,方法的调用时有一定顺序的,一刷新表格,小调用numberOfRows,问一下模型数组有多少条模型数据,其次调用cellForRow,知道每一行对应的cell的高度,所有高度都算完以后,就知道它的contentSize,接下来就可以在这么大的空间中把cell加进去,紧接着就调用cellForRow,从缓存池中取出cell,将模型传给cell,赋值给子控件,紧接着返回cell,一旦返回cell,就会把cell addSubView到tableVIew身上,并且根据行号,算出cell的宽度高度,还有x,y,cell一旦设置完宽高,肯定会调用cell的layoutSubViews,cell真正要添加到tableview上显示,才会调用layoutsubviews
cell一旦改了frame,一定会调用layoutsubviews,重新布局自己的子控件,因为自己的宽高发生变化,里面的子控件也要重新排列
算cell高度的同时,把中间控件的frame算完
先heightForRow再cellForRow,当cell要显示,再次heightForRow