UITableView, прокрутите вниз до перезагрузки? - PullRequest
59 голосов
/ 25 февраля 2011

У меня есть UITableView с cells, которые динамически обновляются.Все отлично работает, кроме случаев, когда вызывается tableview.reload (см. Ниже), чтобы обновить cells в таблице. Я бы хотел, чтобы таблица прокручивалась вниз, чтобы показать новые записи.

- (void)reloadTable:(NSNotification *)notification {
    NSLog(@"RELOAD TABLE ...");
    [customTableView reloadData];
    // Scroll to bottom of UITable here ....
}

Я планировал использовать scrollToRowAtIndexPath:atScrollPosition:animated:, но потом заметил, что у меня нет доступа к indexPath.

Кто-нибудь знает, как это сделать, илиdelegate обратный вызов, который я мог бы использовать?

Ответы [ 11 ]

120 голосов
/ 25 февраля 2011

Использование:

NSIndexPath* ipath = [NSIndexPath indexPathForRow: cells_count-1 inSection: sections_count-1];
[tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionTop animated: YES];

Или вы можете указать индекс раздела вручную (если один раздел => индекс = 0).

37 голосов
/ 10 февраля 2015

Другое решение - перевернуть таблицу по вертикали и перевернуть каждую ячейку по вертикали:

Применить преобразование к UITableView при инициализации:

tableview.transform = CGAffineTransformMakeScale(1, -1);

и в cellForRowAtIndexPath:

cell.transform = CGAffineTransformMakeScale(1, -1);

Таким образом, вам не нужны обходные пути для решения проблем прокрутки, но вам нужно будет немного подумать о contentInsets / contentOffsets и взаимодействиях верхнего / нижнего колонтитула.

33 голосов
/ 16 августа 2013
-(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];

}
9 голосов
/ 23 сентября 2014
//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)
5 голосов
/ 19 января 2016

Поскольку это то, что вы, возможно, захотите использовать очень часто, я предлагаю вам создать расширение класса в UITableView:

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)
            }
        }
    }
}
5 голосов
/ 29 июня 2013

Это еще одно решение, хорошо работающее в моем случае, когда высота ячейки велика.

- (void)scrollToBottom
{
    CGPoint bottomOffset = CGPointMake(0, _bubbleTable.contentSize.height - _bubbleTable.bounds.size.height);
    if ( bottomOffset.y > 0 ) {
        [_bubbleTable setContentOffset:bottomOffset animated:YES];
    }
}
1 голос
/ 16 мая 2018

Swift 3

Для всех, кто здесь пытается выяснить, как решить эту проблему, ключом является вызов метода .layoutIfNeeded() после .reloadData():

tableView.reloadData()
tableView.layoutIfNeeded()
tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentSize.height - tableView.frame.height), animated: false)

Я работал с несколькими разделами в UITableView, и он работал хорошо.

1 голос
/ 19 апреля 2016
Расширение

лучше сделать в UIScrollView, а не в UITableView, таким образом, оно работает с scrollView, tableView, collectionView (вертикальным), 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)
    }

}
0 голосов
/ 29 июня 2019

Swift 5

    func scrollToBottom() {
        let section = self.tableView.numberOfSections
        let row = self.tableView.numberOfRows(inSection: self.tableView.numberOfSections - 1) - 1;
        guard (section > 0) && (row > 0) else{ // check bounds
            return
        }
        let indexPath = IndexPath(row: row-1, section: section-1)
        self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    }

Я не согласен с тем, что мы должны использовать cells_count, sections_count, self.dateSource.count и т. Д. Вместо этого делегат будет лучше.

0 голосов
/ 10 мая 2018

попробуйте этот код, он может вам помочь:

    self.tableView.reloadData()
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+0.1, execute: {
        let indexPath = IndexPath(row: self.dateSource.count-1, section: 0)
        self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: true)
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...