如何将UITableViewCell与UITableView的底部alignment?

当你插入你的第一个UITableViewCellinsertRowsAtIndexPaths:withRowAnimation:它通常出现在UITableView的顶部。 在潜望镜的应用程序 ,相反的发生 – 第一个插入单元格是底部alignment。 随着新的细胞被推入,旧的细胞在表中移动。 这是如何实现的?

在这里输入图像说明

如果您对我在Periscope iOS应用程序中的操作感兴趣,那实际上很简单。

TL; DR; 添加一个高度等于您的表视图框架高度的透明表头标题视图。 然后,在向表中添加单元格时,只需简单地为表格视图的内容偏移量设置animation。

给你的表格视图一个标题视图:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *headerView = [[UIView alloc] initWithFrame:CGRectZero]; headerView.userInteractionEnabled = NO; // all touches within this space must go through to the video layer return headerView; // empty header above chat, so messages flow in from bottom } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return self.tableView.frame.size.height; // empty header above chat, so messages flow in from bottom } 

添加数据到你的表(在我的情况下,消息被添加到一个名为_messages的数组中,然后我调用UITableViewController上的reloadData)。 然后调用这个方法来为以下单元格设置animation效果:

 - (void)scrollTableToBottom { if (!self.isViewLoaded || _messages.count == 0) return; CGFloat offsetY = self.tableView.contentSize.height - self.tableView.frame.size.height + self.tableView.contentInset.bottom; [UIView animateWithDuration:0.33 delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAllowUserInteraction animations:^{ [self.tableView setContentOffset:CGPointMake(0, offsetY) animated:NO]; } completion:nil]; } 

希望有所帮助。 我发现这是一个非常便宜/简单的模拟锚定在底部的单元格的方法。 我知道有些人提到颠倒了桌子,但这对我来说似乎很疯狂。 🙂

你可以使用insertRowsAtIndexPath方法,然后让tableview滚动到底部。

 [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self.posts.count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom]; [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

如果你希望在桌面视图的顶部有巨大的空白,你可以设置滚动偏移量,并在新项目进来时调整。

另一种方法是颠倒桌面,然后颠倒每一行。

斯威夫特4版本的Aaron Wasserman回答。

 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = UIView(frame: .zero) headerView.isUserInteractionEnabled = false return headerView } // Added logic to avoid blank space at the top func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return tableView.frame.size.height - CGFloat(messages.count * cellHeight) } func scrollToBottom(animated: Bool) { if isViewLoaded && messages.count > 0 { let offset = tableView.contentSize.height - tableView.frame.size.height + tableView.contentInset.bottom UIView.animate(withDuration: 0.33, delay: 0, options: [.curveEaseOut, .allowUserInteraction], animations: { self.tableView.setContentOffset(CGPoint(x: 0, y: offset), animated: animated) }, completion: nil) } } 

需要在tableView.reloadData()之后调用scrollToBottom方法