UITableView - прокрутите вверх - PullRequest
364 голосов
/ 07 апреля 2009

В моем табличном представлении я должен прокрутить к вершине. Но я не могу гарантировать, что первым объектом будет секция 0, строка 0. Может быть, мое табличное представление начнется с секции № 5.

Итак, я получаю исключение, когда звоню:

[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

Есть ли другой способ прокрутки до верха представления таблицы?

Ответы [ 32 ]

8 голосов
/ 07 декабря 2014

Swift:

tableView.setContentOffset(CGPointZero, animated: true)
7 голосов
/ 11 января 2018

Свифт 3

tableView.setContentOffset(CGPoint.zero, animated: true)

если tableView.setContentOffset не работает.

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

tableView.beginUpdates()
tableView.setContentOffset(CGPoint.zero, animated: true)
tableView.endUpdates()
7 голосов
/ 11 ноября 2018

НЕ ИСПОЛЬЗОВАТЬ

 tableView.setContentOffset(.zero, animated: true)

Иногда может неправильно устанавливать смещение. Например, в моем случае, ячейка была немного выше обзора со вставками безопасной зоны. Нехорошо.

ВМЕСТО ИСПОЛЬЗОВАНИЯ

 tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
6 голосов
/ 04 февраля 2015

Свифт:

если у вас нет заголовка tableView:

tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

если так:

tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height   + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
5 голосов
/ 01 февраля 2017

Так как мой tableView полон всевозможных вставок, это было единственное, что сработало:

Свифт 3

if tableView.numberOfSections > 0 && tableView.numberOfRows(inSection: 0) > 0 {
  tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
}

Swift 2

if tableView.numberOfSections > 0 && tableView.numberOfRowsInSection(0) > 0 {
  tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
}
5 голосов
/ 04 мая 2017

Я предпочитаю следующее, так как оно учитывает вкладку. Если вставка отсутствует, она все равно будет прокручиваться вверх, так как вставка будет 0.

tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
3 голосов
/ 22 сентября 2017

Вот что я использую для корректной работы на iOS 11:

extension UIScrollView {
    func scrollToTop(animated: Bool) {
        var offset = contentOffset
        if #available(iOS 11, *) {
            offset.y = -adjustedContentInset.top
        } else {
            offset.y = -contentInset.top
        }
        setContentOffset(offset, animated: animated)
    }
}
3 голосов
/ 12 июня 2017

использование contentOffset - неправильный путь. это было бы лучше, поскольку это естественный способ представления таблицы

tableView.scrollToRow(at: NSIndexPath.init(row: 0, section: 0) as IndexPath, at: .top, animated: true)
2 голосов
/ 20 февраля 2018

Swift 4 через расширение, обрабатывает пустой просмотр таблицы:

extension UITableView {
    func scrollToTop(animated: Bool) {
        self.setContentOffset(CGPoint.zero, animated: animated);
    }
}
2 голосов
/ 10 июля 2018

Это был единственный фрагмент кода, который работал для меня

Swift 4:

    tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
    tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
    tableView.setContentOffset(CGPoint(x: 0, y: -70), animated: true)

P.S. 70 - высота моего заголовка и ячейки табличного представления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...