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

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

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

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

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

Ответы [ 32 ]

805 голосов
/ 07 апреля 2009

UITableView является подклассом UIScrollView, поэтому вы также можете использовать:

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

Или

[mainTableView setContentOffset:CGPointZero animated:YES];

А в Свифте:

mainTableView.setContentOffset(CGPointZero, animated:true)

А в Swift 3 и выше:

mainTableView.setContentOffset(.zero, animated: true)
241 голосов
/ 17 января 2012

Я предпочитаю

[mainTableView setContentOffset:CGPointZero animated:YES];

Если у вас есть верхняя вставка в виде таблицы, вы должны вычесть ее:

[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];
67 голосов
/ 16 февраля 2016

Возможные действия:

1

func scrollToFirstRow() {
    let indexPath = NSIndexPath(forRow: 0, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}

2

func scrollToLastRow() {
    let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)
}

3

func scrollToSelectedRow() {
    let selectedRows = self.tableView.indexPathsForSelectedRows
    if let selectedRow = selectedRows?[0] as? NSIndexPath {
        self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true)
    }
}

4

func scrollToHeader() {
    self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
}

5

func scrollToTop(){
    self.tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
}

Отключить прокрутку вверх:

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) {
    for subview in view.subviews {
        if let scrollView = subview as? UIScrollView {
            (scrollView as UIScrollView).scrollsToTop = false
        }
        self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView)
    }
}

Измените и используйте его согласно требованию.

Swift 4

  func scrollToFirstRow() {
    let indexPath = IndexPath(row: 0, section: 0)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
  }
26 голосов
/ 13 августа 2014

Лучше не использовать NSIndexPath (пустая таблица) и не предполагать, что верхней точкой является CGPointZero (вставки содержимого), вот что я использую -

[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];

Надеюсь, это поможет.

20 голосов
/ 08 октября 2017

Swift 4 :

Это работает очень хорошо:

//self.tableView.reloadData() if you want to use this line remember to put it before 
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
12 голосов
/ 17 июня 2015

Для таблиц с contentInset установка смещения содержимого на CGPointZero не будет работать. Он будет прокручиваться до верхней части контента, а не до прокрутки до верхней части таблицы.

При учете содержимого вставки получается следующее:

[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];
11 голосов
/ 27 сентября 2017

Я столкнулся с проблемой вызова некоторых методов на пустом tableView. Вот еще один вариант для Swift 4, который обрабатывает пустые просмотры таблиц.

extension UITableView {
  func hasRowAtIndexPath(indexPath: IndexPath) -> Bool {
    return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section)
  }

  func scrollToTop(animated: Bool) {
    let indexPath = IndexPath(row: 0, section: 0)
    if self.hasRowAtIndexPath(indexPath: indexPath) {
      self.scrollToRow(at: indexPath, at: .top, animated: animated)
    }
  }
}

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

// from yourViewController or yourTableViewController
tableView.scrollToTop(animated: true)//or false
10 голосов
/ 26 апреля 2013

Этот код позволяет вам прокручивать определенный раздел вверх

CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin = [tableinstacne convertPoint:cellRect.origin 
                                    fromView:<tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];
9 голосов
/ 18 января 2018

В iOS 11 используйте adjustedContentInset для правильной прокрутки вверх для обоих случаев, когда строка состояния в вызове видна или нет.

if (@available(iOS 11.0, *)) {
    [tableView setContentOffset:CGPointMake(0, -tableView.adjustedContentInset.top) animated:YES];
} else {
    [tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:YES];
}

Swift:

if #available(iOS 11.0, *) {
    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true)
} else {
    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
}
8 голосов
/ 07 сентября 2015

В дополнение к тому, что уже было сказано, вы можете создать расширение (Swift) или категорию (Objective C), чтобы облегчить это в будущем:

Swift:

extension UITableView {
    func scrollToTop(animated: Bool) {
        setContentOffset(CGPointZero, animated: animated)
    }
}

В любое время, когда вы хотите прокрутить любой заданный табличный вид наверх, вы можете вызвать следующий код:

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