不等高cell自定义的思路精髓

## 精华界面不等高cell的搭建

1 . 精华界面搭建,tableview展示数据;

不等高cell(复杂界面)

1.1 划分结构(功能结构)top view  middle  view   最热评论view  底部的view

1.2 搭建界面方式:纯代码 (因为有些结构不确定是否显示)

1.3. 当cell一开始创建的时候,把所有子结构全部添加上去;

知识点:

通过注册class创建cell;那么cell创建的 方式initwithStyle

通过代码创建cell,必定来initwithStyle 方法

不会来到initWithframe

什么时候来到initWithframe方法呢?控件通过init方法 才会执行initWithframe

通过XIB就必定来到 awarkFromeNib ;

A .cell不同架构流程思想:

1.顶部view的展示:

自定义cell,因为有些功能系统可能实现不了,所以需要自定义cell;

由于整个cell可以大致分为4个模块,并且都有自己的功能与逻辑;再自定义View.XIB;

2.数据传值;

自定义cell中拿不到XIB中控件,传不了值;需要跨多个类传值;

所以每个类当中定义模型属性。传值,重写set方法;

3.计算cell的frame

在哪里计算?

一般是在heightForRowAtIndexPath:方法中进行计算,但是这个方法调用频率非常高;所以最好只需要计算一次就行;在数据请求成功的时候,但是cell还没有刷新的时候就计算好高度就可以;

疑问:在显示cell的时候,为什么文字有的能显示,有的只显示一半,有的超过了cell的高度;

猜算,估计是cell的循环利用出现错误;

4.MVVM思想:

将模型中保存的数据给到视图模型;取数据,存数据都是存视图模型当中;

VM专门去处理视图业务逻辑,计算视图子控件frame

抽取思路:

a. 创建视图模型 (nsobject)

b. 请求数据,字典数组变成模型数组,定义指针指向他;

c. 遍历模型数组;创建视图模型,将遍历出的模型数据给到视图模型;

d. 视图模型:定义模型属性保存传入的数据;

注意:在传值的时候就直接把cell的frame计算出来;

e.  重写set方法;在set方法中给cell计算尺寸;

f. 在外面定义属性保存cell的frame;和topView的frame

为什么要定义两个?、??

因为一个cell里面包含了topview,还有其他的view,并且之后的view都是添加到top view的后面的;

B .中间图片展示

1.架构搭建;

为什么要用XIB去做???

因为中间的图片有可能显示图片,视频,音频。或者不显示;那这个时候就不怎么好去做,只要是不确定的控件,

该隐藏的隐藏,不该隐藏的就显示,做个判断就可以;

A. 注意点,在进行命名的时候;一定不要把XIB的名字设置成跟某一个控制器的名称一样;如果一样,那么在加载过程中,底层会先判断该文件当中,有没有同名的view,或者去掉controller的view,只要有一个符合,那么控制器首先就会去加载这些相同的view;

B.描述XIB时,他的frame不用去管,只需要确定内部子控件的约束就行;具体的frame在外面才计算

C.设置picture view的尺寸,它的Y值是以top view  cell 的高度为基准;

D.不要犯SB错误了;

因为在initwithstyle 方法中加载picture view的时候,尽然用了alloc  init  ,却没有调用加载XIB的类方法;死活出不来数据

C.中间图片的细节处理

问题1. GIF图,不是大图,就把点击查看大图按钮隐藏起来;

问题2 . 大图又太长。并且有些大图宽度是不够的,如何解决?

设置图片的高度的时候,判断H是大于屏幕的高度,是的就将H定在某个值;并且记录当前是大图,赋值Yes;

在下载图片完成的时候,将图片画出来;

画之前,最好判断是不是大图,不是就不用画;

a.开启图形上下文;带有三个参数的;第一个,绘画的范围;第二,填NO 第三 。0 就行

b。画图

c. 获取绘画的图片;

d.关闭上下文,

e.将最新的图片赋值回去;

D.下载进度条的处理

进度条,一般都是去github去搜索,别人的一些框架;都是下载回来就用

利用终端下载框架;

包含头文件

思路:

1.控件通过XIB,一定会来到awerkFromeNib方法;

a.设置进度条的颜色,以及进度值;

不等高cell自定义的思路精髓_第1张图片
进度条

2.重写SET方法

a.图片下载到到沙盒

b. 如果沙盒中有,直接让进度条变为0;不下载;

c.如果没有,就下载;

事先把进度条清0;利用SD框架下载

如何让下载的进度显示文,真实的数据滚动???想要显示进度条,在progress中显示;


不等高cell自定义的思路精髓_第2张图片

E,视频界面搭建处理

视屏也用XIB描述

a. 他的frame只需要设置一次就可以了,将frame修改为统一的属性描述;

b.如何加载视屏类型???

c.在加载数据的时候,增加相对应的参数值,下载的数据就会不一样;

d.模型中添加界面需要的属性值;

e.cell中获取数据的时候,判断一下,返回的是什么类型的参数;不要的隐藏,要的显示;

f.   拿到控件进行赋值的时候;要求记录多少时间;

不等高cell自定义的思路精髓_第3张图片

g.每个类都需要加载XIB,并且拥有模型属性;

抽取一个基类,将模型,加载XIB方法,添加进去,子类继承他自然就会有父类的方法

G: 音频界面搭建处理:

a.音频I的XIB搭建;

b.cell中传递数据信息,进行判断; 类型是音频,就把其他控件,视频,图片隐藏; 不是音      频,就全部隐藏,就是段子

c.数据赋值注意点

时间的算法跟上图的一样;

H:最热评论view搭建,分析

a. 有可能出现两种不同的情况;

1.只有评论,没有声音;

2.只有声音,没有评论;

XIB中评论先确定好位置;然后再往lable上面添加一个view;view里面放其他控件;

b. 搭建完,查看数据并设置模型属性

1.特点,数组中包含字典,字典包含字典;复杂层次结构;

解决思路:开发中碰到这种情况;一般是一个字典对应一个模型;如果用数组去解决的话,很麻烦;


不等高cell自定义的思路精髓_第4张图片

1.1 利用MJ框架,MJ框架底层是在做什么事情呢?

mj框架转模型,底层会去遍历模型的属性;去文件中找,找到了就会帮他去赋值;

1.2,如何将数组中的值转换到模型属性中去?

取出数组中的第一个字典,kvc将字典转换成模型;

2。尺寸设定问题:

1. 视图模型中去写尺寸;视图模型专门处理这些视图控件的业务逻辑

1.1 判断是否是评论模型

判断模型中的属性有没有内容(文字),只要是判断,文字的内容就用length

是 ==》计算文字的内容;根据内容计算文字高度;

不是 ===》 另外计算;

1.2. 在view中对控件赋值;

还是先判断模型中有没有内容长度;

有===》就是文字评论   对文字进行一个拼接;

没有===》语音音频;

你可能感兴趣的:(不等高cell自定义的思路精髓)