前言
使用了第三方布局框架MyLayout
(地址)來(lái)創(chuàng)建IM
聊天界面甲喝。
因?yàn)橹恍枰獎(jiǎng)?chuàng)建一套UI
即可實(shí)現(xiàn)兩套布局
尝苇。
設(shè)置一個(gè)屬性layoutTransform
即可。
跳動(dòng)問(wèn)題
刷新界面時(shí)埠胖,因?yàn)椴捎昧?code>動(dòng)態(tài)高度來(lái)計(jì)算 cell 高度
導(dǎo)致了高度估算不準(zhǔn)
所以會(huì)導(dǎo)致跳動(dòng)問(wèn)題
辦法:
- 1.不使用
動(dòng)態(tài)高度
- 2.手動(dòng)計(jì)算 cell 高度糠溜,然后緩存到對(duì)應(yīng)的
模型
上。系統(tǒng)調(diào)用方法的順序如下:- 2.1 在方法
tableView:cellForRowAtIndexPath:
內(nèi)押袍,給 cell 模型賦值時(shí),計(jì)算高度凯肋。 - 2.2 在方法
tableView:heightForRowAtIndexPath:
內(nèi)谊惭,取出對(duì)應(yīng)模型,返回高度侮东。
- 2.1 在方法
滾動(dòng)問(wèn)題
添加數(shù)據(jù)源圈盔,列表插入數(shù)據(jù),滾動(dòng)到列表底部:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_dataArray.count inSection:0];
[_dataArray addObject:model];
[_tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:YES];
就是這么幾行簡(jiǎn)單的代碼
列表就是滾動(dòng)不到底部悄雅!
找了好多資源
找了好多Demo
就是沒(méi)發(fā)現(xiàn)問(wèn)題所在 T_T
Style
當(dāng)列表初始化時(shí)驱敲,設(shè)置 style
為 Grouped
時(shí)
發(fā)現(xiàn)列表可以滾動(dòng)到底部了
進(jìn)一步測(cè)試
又不行了
這個(gè)只有在列表
已經(jīng)滾動(dòng)到底部的時(shí)候
才能生效 T_T
系統(tǒng)方法
UITableView 的一個(gè)代理方法 insertRowsAtIndexPaths:withRowAnimation:
在被調(diào)用時(shí)
會(huì)調(diào)用另外一個(gè)代理方法:tableView:heightForRowAtIndexPath:
而這個(gè)方法
只是取了對(duì)應(yīng)模型
然后返回 cell 高度
但是 cell 數(shù)量超過(guò)一屏?xí)r
并沒(méi)有調(diào)用 tableView:cellForRowAtIndexPath:
這個(gè)方法
所以
上面返回的模型高度是 0
!
天真的以為
系統(tǒng)會(huì)先調(diào)用tableView:cellForRowAtIndexPath:
獲取 cell
然后調(diào)用 tableView:heightForRowAtIndexPath:
返回高度
辦法:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
JHMessageModel *model = _dataArray[indexPath.row];
if (model.height == 0) { // 高度為0時(shí),手動(dòng)調(diào)用方法宽闲,計(jì)算高度众眨。
[self tableView:tableView cellForRowAtIndexPath:indexPath];
}
return model.height;
}
終于解決了N漳痢!娩梨!
不管是 style
是 plain
還是 grouped
都沒(méi)問(wèn)題了
最后
沒(méi)有Demo提供
https://github.com/xjh093