UITableView,重新加载滚动到底部?
我有一个UITableView
与dynamic更新的cells
。 除了调用tableview.reload
(见下面)来刷新表格中的cells
时,一切正常,我希望表格滚动到底部以显示新条目。
- (void)reloadTable:(NSNotification *)notification { NSLog(@"RELOAD TABLE ..."); [customTableView reloadData]; // Scroll to bottom of UITable here .... }
我打算使用scrollToRowAtIndexPath:atScrollPosition:animated:
但后来注意到我没有访问indexPath
。
有谁知道如何做到这一点,或者我可以使用delegate
callback?
使用:
NSIndexPath* ipath = [NSIndexPath indexPathForRow: cells_count-1 inSection: sections_count-1]; [tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionTop animated: YES];
或者您可以手动指定节索引(如果一节=>索引= 0)。
-(void)scrollToBottom{ [self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES]; }
另一种解决scheme是垂直翻转桌子,并垂直翻转每个单元格:
初始化时将转换应用于UITableView:
tableview.transform = CGAffineTransformMakeScale(1, -1);
并在cellForRowAtIndexPath:
cell.transform = CGAffineTransformMakeScale(1, -1);
这样您就不需要解决滚动问题的解决方法,但是您需要考虑一下有关contentInsets / contentOffsets和页眉/页脚交互的问题。
//In swift var iPath = NSIndexPath(forRow: self.tableView.numberOfRowsInSection(0)-1, inSection: self.tableView.numberOfSections()-1) self.tableView.scrollToRowAtIndexPath(iPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: true)
这是另一个解决scheme,在我的情况下,单元格高度大的时候效果很好。
- (void)scrollToBottom { CGPoint bottomOffset = CGPointMake(0, _bubbleTable.contentSize.height - _bubbleTable.bounds.size.height); if ( bottomOffset.y > 0 ) { [_bubbleTable setContentOffset:bottomOffset animated:YES]; } }
由于这是你可能想经常使用的东西,我build议你在UITableView上创build一个类扩展:
extension UITableView { func scrollToBottom(animated: Bool = true) { let section = self.numberOfSections if section > 0 { let row = self.numberOfRowsInSection(section - 1) if row > 0 { self.scrollToRowAtIndexPath(NSIndexPath(forRow: row - 1, inSection: section - 1), atScrollPosition: .Bottom, animated: animated) } } } }
扩展最好在UIScrollView而不是UITableView上完成,这样它可以在scrollView,tableView,collectionView(vertical),UIWebView(内部滚动视图)等
public extension UIScrollView { public func scrollToBottom(animated animated: Bool) { let rect = CGRectMake(0, contentSize.height - bounds.size.height, bounds.size.width, bounds.size.height) scrollRectToVisible(rect, animated: animated) } }
这是最好的方法。 – (void)scrollToBottom {CGFloat yOffset = 0;
if (self.tableView.contentSize.height > self.tableView.bounds.size.height) { yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height; } [self.tableView setContentOffset:CGPointMake(0, yOffset) animated:NO];
}