我有一个UITableView,其内容是动态变化的,就像FIFO堆栈一样。将细胞添加到底部并从顶部移除。
这很好用,我可以滚动到indexPath,这样最新的消息总是向下滚动到底部(就像聊天应用程序一样)。
现在..我想在该表部分添加一个页脚。而不是使用
SrollToRowAtIndexPath
我希望能够滚动到tableFooterView。
任何想法如何做到这一点将不胜感激。
答案 0 :(得分:27)
将UITableView
滚动到其底部的footerView的最佳方法是简单地设置内容偏移量。您可以使用contentSize
和当前bounds
这是我的方式。
CGPoint newContentOffset = CGPointMake(0, [self.instanceOfATableView contentSize].height - self.instanceOfATableView.bounds.size.height);
[self.instanceOfATableView setContentOffset:newContentOffset animated:YES];
答案 1 :(得分:27)
我使用它来滚动到tableView的页脚视图:
[self.tableView scrollRectToVisible:[self.tableView convertRect:self.tableView.tableFooterView.bounds fromView:self.tableView.tableFooterView] animated:YES];
答案 2 :(得分:14)
感谢iphone_developer这就是我所做的:
[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:0]-1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
然后在我添加行的时候,我正在调用它,并且我的tableView的页脚视图保持可见
答案 3 :(得分:14)
这么多糟糕的答案。 : - )
最佳方式:
[self.tableView scrollRectToVisible:
self.tableView.tableFooterView.frame animated:YES
];
答案 4 :(得分:4)
可能是这样的:
[tableView setContentOffset:CGPointMake(0, tableView.contentSize.height) animated:YES];
答案 5 :(得分:3)
由于UITableView是UIScrollView的子类,因此您可以使用UIScrollView方法滚动到任意位置
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated
只需设置矩形,以便在可见时页脚可见,并且您将获得解决方案(只要您始终获得正确的行为,您就可以使用页脚的矩形或其他内容)。< / p>
答案 6 :(得分:2)
我最近的回答是针对开发人员,他们需要在显示键盘时显示页脚。 正确的解决方案是考虑contentInset属性(可以在键盘显示后更改),所以它非常简单:
- (void)scrollToFooter {
UIEdgeInsets tableInsets = self.tableView.contentInset;
CGFloat tableHeight = self.tableView.frame.size.height - tableInsets.bottom - tableInsets.top;
CGFloat bottom = CGRectGetMaxY(self.tableView.tableFooterView.frame);
CGFloat offset = bottom - tableHeight;
if(offset > 0.f) {
[self.tableView setContentOffset:CGPointMake(0, offset) animated:YES];
}
}
我必须注意,在我的情况下,tableView被添加到我自己的ViewController中,其中一个单元格具有UITextField,后者成为第一响应者。要在显示键盘时移动显示页脚,您需要注册键盘显示通知,并且(在iOS7上)在当前运行循环结束时执行此方法,因为在这种情况下,iOS7会在我们的方法和页脚不显示后自动执行scrollToRowAtIndexPath。
-(void)registerKeyboardNotification {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShown:)
name:UIKeyboardDidShowNotification object:nil];
}
- (void)keyboardDidShown:(id)notification {
//move to the end of run loop
[self performSelector:@selector(scrollToFooter) withObject:nil afterDelay:.0];
}
答案 7 :(得分:1)
最简单的方法是在最后一节中的最后一行使用UITableViewScrollPositionTop。这对我很有用......
[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:LAST_ROW inSection:LAST_SECTION] atScrollPosition:UITableViewScrollPositionTop animated:YES];
确保您的表格页脚视图在底部间距很好,并且它应该在视图中很好地设置动画...
希望这会有所帮助......
答案 8 :(得分:1)
这对我很好!
CGRect footerBounds = [addCommentContainer bounds];
CGRect footerRectInTable = [tableview convertRect:footerBounds fromView:addCommentContainer];
[tableview scrollRectToVisible:footerRectInTable animated:YES];
答案 9 :(得分:0)
好主意,自己正在寻找这个:)这是示例代码,可以解决这个问题:
[tableView reloadData];
NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:1];
[tableView scrollToRowAtIndexPath:index
atScrollPosition:UITableViewScrollPositionBottom animated:YES];
你的tableView页脚必须至少有一个单元格,问题是它会显示出来。没时间测试,但我猜你可以把它变得很小?
此外,您必须在 numberOfSectionsInTableView (至少一个用于表格和一个用于页脚), numberOfRowsInSection (至少一个用于页脚,您的上一部分)中实现正确的内容, viewForHeaderInSection (除了您的单元格为零), heightForHeaderInSection (可能如果您将其设置为零), cellForRowAtIndexPath (为您的单元格添加特殊情况)页脚)...
这应该足够了。
答案 10 :(得分:0)
我正在使用它:
- (void)scrollToBottom{
[self.myTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[self.fetchedResultsController.fetchedObjects count] -1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
答案 11 :(得分:0)
这项工作对我来说:
- (void)tableViewScrollToBottomAnimated:(BOOL)animated {
NSInteger numberOfRows = [self.tableView numberOfRowsInSection:0];
if (numberOfRows) {
if (self.tableView.tableFooterView) {
[self.tableView scrollRectToVisible:
self.tableView.tableFooterView.frame animated:YES
];
} else {
[self.tableView scrollToRowAtIndexPath:
[NSIndexPath indexPathForRow:numberOfRows-1 inSection:0]
atScrollPosition:UITableViewScrollPositionBottom
animated:animated
];
}
}
}
答案 12 :(得分:0)
这适用于Swift 4
func addRow() {
tableView.beginUpdates()
tableView.insertRows(at: [IndexPath(row: array.count - 1, section: 0)], with: .automatic)
tableView.endUpdates()
DispatchQueue.main.async {
self.scrollToBottom()
}
}
func scrollToBottom() {
let footerBounds = tableView.tableFooterView?.bounds
let footerRectInTable = tableView.convert(footerBounds!, from: tableView.tableFooterView!)
tableView.scrollRectToVisible(footerRectInTable, animated: true)
}
答案 13 :(得分:-4)
我还没试过,但滚动到最后一行+ 1时会发生什么?
另一个想法是总是在末尾添加一个虚拟条目并使其具有不同的外观,因此它被视为页脚。然后你可以随时滚动到那个。