Как прокрутить до нижней части UITableView на iPhone, прежде чем появится представление - PullRequest
129 голосов
/ 05 мая 2010

У меня есть UITableView, который заполнен ячейками переменной высоты. Я бы хотел, чтобы таблица прокручивалась до самого дна, когда представление открывается.

В настоящее время у меня есть следующая функция

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];

log - изменяемый массив, содержащий объекты, составляющие содержимое каждой ячейки.

Приведенный выше код прекрасно работает в viewDidAppear, однако это имеет неприятный побочный эффект: отображение верхней части таблицы при первом появлении представления и последующее его перепрыгивание вниз. Я бы предпочел, чтобы table view можно было прокрутить вниз, прежде чем оно появится.

Я попробовал прокрутить в viewWillAppear и viewDidLoad, но в обоих случаях данные еще не были загружены в таблицу, и оба выдают исключение.

Любое руководство будет высоко ценится, даже если это всего лишь случай, чтобы сказать мне, что у меня есть все, что возможно.

Ответы [ 31 ]

2 голосов
/ 18 апреля 2016

Используйте этот простой код для прокрутки таблицы. Вид снизу

NSInteger rows = [tableName numberOfRowsInSection:0];
if(rows > 0) {
    [tableName scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:rows-1 inSection:0]
                     atScrollPosition:UITableViewScrollPositionBottom
                             animated:YES];
}
2 голосов
/ 17 января 2017

Функция на swift 3 прокрутка вниз

 override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(false)
        //scroll down
        if lists.count > 2 {
            let numberOfSections = self.tableView.numberOfSections
            let numberOfRows = self.tableView.numberOfRows(inSection: numberOfSections-1)
            let indexPath = IndexPath(row: numberOfRows-1 , section: numberOfSections-1)
            self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.middle, animated: true)
        }
    }
1 голос
/ 06 июня 2016

Если вы настраиваете фрейм для просмотра таблицы программно, убедитесь, что вы устанавливаете фрейм правильно.

1 голос
/ 01 апреля 2015

В iOS это работало нормально для меня

CGFloat height = self.inputTableView.contentSize.height;
if (height > CGRectGetHeight(self.inputTableView.frame)) {
    height -= (CGRectGetHeight(self.inputTableView.frame) - CGRectGetHeight(self.navigationController.navigationBar.frame));
}
else {
    height = 0;
}
[self.inputTableView setContentOffset:CGPointMake(0, height) animated:animated];

Это нужно вызвать с viewDidLayoutSubviews

1 голос
/ 26 января 2016

Нет необходимости в прокрутке, вы можете просто сделать это, используя этот код:

[YOURTABLEVIEWNAME setContentOffset:CGPointMake(0, CGFLOAT_MAX)];
1 голос
/ 10 сентября 2015

[self.tableViewInfo scrollRectToVisible: CGRectMake (0, self.tableViewInfo.contentSize.height-self.tableViewInfo.height, self.tableViewInfo.width, self.tableViewInfo.height) animated: YES];

1 голос
/ 15 октября 2015

Принятый ответ не работал с моей таблицей (тысячи строк, динамическая загрузка), но код ниже работает:

- (void)scrollToBottom:(id)sender {
    if ([self.sections count] > 0) {
        NSInteger idx = [self.sections count] - 1;
        CGRect sectionRect = [self.tableView rectForSection:idx];
        sectionRect.size.height = self.tableView.frame.size.height;
        [self.tableView scrollRectToVisible:sectionRect animated:NO];
    }
}
0 голосов
/ 25 мая 2019

На iOS 12 принятый ответ, кажется, не работает. У меня это работало со следующим расширением



import UIKit

extension UITableView {
    public func scrollToBottom(animated: Bool = true) {
        guard let dataSource = dataSource else {
            return
        }

        let sections = dataSource.numberOfSections?(in: self) ?? 1
        let rows = dataSource.tableView(self, numberOfRowsInSection: sections-1)
        let bottomIndex = IndexPath(item: rows - 1, section: sections - 1)

        scrollToRow(at: bottomIndex,
                    at: .bottom,
                    animated: animated)
    }
}
0 голосов
/ 26 июля 2016

В Swift вам просто нужно

self.tableView.scrollToNearestSelectedRowAtScrollPosition(UITableViewScrollPosition.Bottom, animated: true)

чтобы сделать автоматическую прокрутку до кнопки

0 голосов
/ 28 августа 2017

Я считаю, что старые решения не работают с swift3.

Если вы знаете число строк в таблице, вы можете использовать:

tableView.scrollToRow(
    at: IndexPath(item: listCountInSection-1, section: sectionCount - 1 ), 
    at: .top, 
    animated: true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...