在聊天界面里斗锭,發(fā)送消息后地淀,需要將發(fā)送的消息顯示在最后一行。
聊天的消息通過TableView來顯示岖是,每次發(fā)送消息后帮毁,在TableView最底部添加一行celll來顯示消息,并滑動(dòng)到TableView最后一行豺撑,預(yù)期實(shí)現(xiàn)像微信那樣順滑的從下往上頂?shù)男Ч?br>
關(guān)鍵代碼:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:mut.count - 1 inSection:0]; // mut為數(shù)據(jù)源
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
這樣會(huì)出現(xiàn)閃屏的問題:
TableView向上彈一段距離烈疚,增加的cell動(dòng)畫出現(xiàn),即使設(shè)置成UITableViewRowAnimationNone,還是存在閃屏聪轿。
嘗試不使用 scrollToRowAtIndexPath爷肝,通過contentSize和frame計(jì)算出offset,在設(shè)置TableView的setContentOffset,還是會(huì)出現(xiàn)閃屏的效果陆错。
解決方式:
在修改數(shù)據(jù)源后阶剑,直接reload。
relaod之前隱藏tableview危号,reload之后滑動(dòng)到底部,顯示tableview素邪。
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:mut.count - 1 inSection:0];
self.tableView.hidden = YES;
[self.tableView reloadData];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
self.tableView.hidden = NO;
效果:
另外有一個(gè)清奇的思路
將tableview在初始化的時(shí)候旋轉(zhuǎn)180度外莲,cell也做同樣的處理。
CGAffineTransformRotate(self.transform, M_PI)
同時(shí)需要將初始的數(shù)據(jù)源倒序排列兔朦。
在增加新的消息的時(shí)候只要插入到數(shù)據(jù)源的首位偷线,將cell插入tableview的首行,tableview會(huì)自動(dòng)處理增加第一行cell的動(dòng)畫而不需要主動(dòng)調(diào)用tableview的滾動(dòng)沽甥。
[mut insertObject:cellModel atIndex:0];
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
但是声邦,仍存在一個(gè)問題,消息記錄不管多少是從底部開始加載的摆舟。沒有歷史消息的時(shí)候亥曹,第一條消息是從最后一行加載出來,不會(huì)顯示在界面頂部恨诱。
效果: