## 精华界面不等高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.设置进度条的颜色,以及进度值;
2.重写SET方法
a.图片下载到到沙盒
b. 如果沙盒中有,直接让进度条变为0;不下载;
c.如果没有,就下载;
事先把进度条清0;利用SD框架下载
如何让下载的进度显示文,真实的数据滚动???想要显示进度条,在progress中显示;
E,视频界面搭建处理
视屏也用XIB描述
a. 他的frame只需要设置一次就可以了,将frame修改为统一的属性描述;
b.如何加载视屏类型???
c.在加载数据的时候,增加相对应的参数值,下载的数据就会不一样;
d.模型中添加界面需要的属性值;
e.cell中获取数据的时候,判断一下,返回的是什么类型的参数;不要的隐藏,要的显示;
f. 拿到控件进行赋值的时候;要求记录多少时间;
g.每个类都需要加载XIB,并且拥有模型属性;
抽取一个基类,将模型,加载XIB方法,添加进去,子类继承他自然就会有父类的方法
G: 音频界面搭建处理:
a.音频I的XIB搭建;
b.cell中传递数据信息,进行判断; 类型是音频,就把其他控件,视频,图片隐藏; 不是音 频,就全部隐藏,就是段子
c.数据赋值注意点
时间的算法跟上图的一样;
H:最热评论view搭建,分析
a. 有可能出现两种不同的情况;
1.只有评论,没有声音;
2.只有声音,没有评论;
XIB中评论先确定好位置;然后再往lable上面添加一个view;view里面放其他控件;
b. 搭建完,查看数据并设置模型属性
1.特点,数组中包含字典,字典包含字典;复杂层次结构;
解决思路:开发中碰到这种情况;一般是一个字典对应一个模型;如果用数组去解决的话,很麻烦;
1.1 利用MJ框架,MJ框架底层是在做什么事情呢?
mj框架转模型,底层会去遍历模型的属性;去文件中找,找到了就会帮他去赋值;
1.2,如何将数组中的值转换到模型属性中去?
取出数组中的第一个字典,kvc将字典转换成模型;
2。尺寸设定问题:
1. 视图模型中去写尺寸;视图模型专门处理这些视图控件的业务逻辑
1.1 判断是否是评论模型
判断模型中的属性有没有内容(文字),只要是判断,文字的内容就用length
是 ==》计算文字的内容;根据内容计算文字高度;
不是 ===》 另外计算;
1.2. 在view中对控件赋值;
还是先判断模型中有没有内容长度;
有===》就是文字评论 对文字进行一个拼接;
没有===》语音音频;