如何将UITableView滚动到tableFooterView

时间:2009-08-31 03:30:43

标签: iphone uitableview

我有一个UITableView,其内容是动态变化的,就像FIFO堆栈一样。将细胞添加到底部并从顶部移除。

这很好用,我可以滚动到indexPath,这样最新的消息总是向下滚动到底部(就像聊天应用程序一样)。

现在..我想在该表部分添加一个页脚。而不是使用

SrollToRowAtIndexPath

我希望能够滚动到tableFooterView。

任何想法如何做到这一点将不胜感激。

14 个答案:

答案 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时会发生什么?

另一个想法是总是在末尾添加一个虚拟条目并使其具有不同的外观,因此它被视为页脚。然后你可以随时滚动到那个。