实现微博cell处理
- 单条微博的处理 / 图片高度自适应
1.多张,单张图片高度的处理
-
单条微博的视图模型
-
如果没有任何父类,如果希望在开发时调试,输出调试信息,需要
-
遵守CustomStringConvertible协议
-
实现desciription 是计算型属性
var description:String { return status.description }
-
视图列表模型 中引用视图模型
listViewModel -> aViewModelvar arrary = [WBStatusViewModel]() // for 循环遍历返回的数组,字典转模型 for dict in list ??[ ] { guard let model = WBStatus.yymodel(with:dict) else { continue } // 根据转的model,初始化ViewModel,拼接到数组中 arrary.append(WBStatusViewModel(model:model)) // 如果是上拉刷新,数据拼接末尾,不是上拉刷新,拼接在数组前面 if pullUp { self.statusList +=arrary }else{ self.statusList = arrary + self.statusList } } -
ViewModel中增加储值属性,使用内存换CPU,cell中不用重复计算
-
增加会员image,认证image,数字字符串,储值属性,在cell中直接赋值

-
一个xib中拖出来N个View,如果功能独立,可以创建view方便处理
-
创建view添加到Cell上

2.图片的处理
- 九宫格的创建,9个UIImageView for循环设置frame

- 九宫格视图的计算
- 设置外边距,内边距
- 根据外边距,内边距,设置view宽度,设置PictureView的宽度,高度(1*1)
- 根据count计算列数,
- 根据列数,计算view的高度
func calcPictureViewSize(count:Int?)->CGSize{ guard let count = count else{ return CGSize() } // 计算配图视图高度 // 外边距 let WBStatusPictureViewOuterMargin = CGFloat(12) /// 内边界 let WBStatusPictureViewInnerMargin = CGFloat(3) /// view视图的W let height = WBStatusPictureViewOuterMargin + CGFloat(row) * pitureWith + CGFloat(row-1)*WBStatusPictureViewInnerMargin return CGSize(width: pictureItmeWidth, height: height) }
3.单图的处理
-
使用GCD调度组,下载一个图片之后处理单张图片的大小,保存下来
- 在viewMolde 中增加方法,使用储值属性记录imageSize

- 在listModel每次下载完成一张图片之后进行调用刷新PictureSize
- 等调度组完成之后,之后再回调。

- 在viewMolde 中增加方法,使用储值属性记录imageSize
-
当一个图过宽或者过窄的时候需要程序处理


-
在PictureView 中设置statusMolde
-
根据model的pictureSize 处理宽高,处理单图,处理无图

4.cell的自动布局,和缓存行高
-
自动布局
- 设置tableView预估行高,和rowHeight 是自动计算
- 有一个从上到下的约束,lable 到下边距是>= 一个数组
let table = UITableView() table.rowHeight = UITableViewAutomaticDimension table.estimatedRowHeight = 300;
-
缓存行高
- 取消xib 中>= 约束,设置为=约束
- 取消
table.rowHeight = UITableViewAutomaticDimension
-
计算cell高度思路

-
计算文字,转发文字的长度

-
计算的高度,使用存储属性记录,设置好image更新高度后再计算一边

-
总结缓存行高

5.选中的某个cell后快速的恢复到选中前的状态
-
tableView如何让选中的某个cell后快速的恢复到选中前的状态(选中时的灰色动态消失)?