这让我感到疯狂......我知道有许多类似的问题,但似乎没有一贯的工作。我有一个UITableView有条件地有一个footerView集,我有一个方法滚动到视图的底部
- (void)scrollToBottom {
dispatch_async(dispatch_get_main_queue(), ^{
if (self.tableView.tableFooterView && self.tableView.tableFooterView.frame.size.height > 0) {
[self.tableView scrollRectToVisible:self.tableView.tableFooterView.frame animated:YES];
} else {
if ([self.tableView numberOfSections] > 0) {
NSInteger numRows = [self.tableView numberOfRowsInSection:0];
if (numRows > 0){
NSIndexPath* ipath = [NSIndexPath indexPathForRow: numRows - 1 inSection: 0];
[self.tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionBottom animated: YES];
}
}
}
});
}
在controllerDidChangeContent
之后在我的[self.tableView endUpdates];
方法中调用(虽然我尝试在许多不同的地方调用相同的方法)。 scrollToRowAtIndexPath
每次都像魅力一样,但scrollRectToVisible
只能偶尔使用。当我放入一个断点时,我可以看到tableView.contentSize.height
只有60.0(footerView的高度)。是否有其他地方我可以调用此方法,我知道内容将完全加载?我可以搭载scrollToRowAtIndexPath
版本并碰撞contentOffset吗?任何新的想法将不胜感激(我的键盘和脸将会感谢你阻止我进一步抨击他们。)
答案 0 :(得分:0)
首先尝试强制布局:
if (self.tableView.tableFooterView && self.tableView.tableFooterView.frame.size.height > 0) {
[self.tableView layoutIfNeeded];
[self.tableView scrollRectToVisible:self.tableView.tableFooterView.frame animated:YES];
} else ...
答案 1 :(得分:0)
使用:
而不是scrollToRowAtIndex路径CGPoint bottomOffset = CGPointMake(0,self.tableView.contentSize.height);
[self.tableView setContentOffset:bottomOffset animated:YES];
答案 2 :(得分:0)
好吧,我认为我有一个解决方法,但我不知道为什么它是必要的。我只需要在我的滚动方法中的代码之前添加[self.tableView reloadData]
,使其成为:
- (void)scrollToBottom {
[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
if (self.tableView.tableFooterView && self.tableView.tableFooterView.frame.size.height > 0) {
[self.tableView scrollRectToVisible:self.tableView.tableFooterView.frame animated:YES];
} else {
if ([self.tableView numberOfSections] > 0) {
NSInteger numRows = [self.tableView numberOfRowsInSection:0];
if (numRows > 0){
NSIndexPath* ipath = [NSIndexPath indexPathForRow: numRows - 1 inSection: 0];
[self.tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionBottom animated: YES];
}
}
}
});
}
奇怪的是,同样的reloadData
在此次通话之前被召唤了几次,所以我不确定为什么会这样,但也许其他人有一个很好的解释(至少比我的&#更好) 34;我尝试了它并且它起作用了#34;一个。