cell的中间控件frame设置

算好高度以后,就腾出地方了,就把中间控件放到对应的位置上,如何放呢?

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

你可能感兴趣的:(cell的中间控件frame设置)