UITableView - прокрутите вверх

326

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

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

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

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

Теги:

25 ответов

701
Лучший ответ

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

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

или

[mainTableView setContentOffset:CGPointZero animated:YES];

И в Swift:

mainTableView.setContentOffset(CGPointZero, animated:true)

И в Swift 3:

mainTableView.setContentOffset(CGPoint.zero, animated: true)
  • 0
    Спасибо, это помогло.
  • 0
    У меня тоже работал, даже с tableHeaderView
Показать ещё 24 комментария
216

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

[mainTableView setContentOffset:CGPointZero animated:YES];

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

[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];
  • 12
    Помидор, помидор. Хм ... Это не очень ясно в письменной форме.
  • 14
    Это лучший способ использовать, когда у вас есть представления верхнего или нижнего колонтитула таблицы и вы хотите, чтобы они тоже были включены.
Показать ещё 6 комментариев
34

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

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)
  }
  • 6
    Хорошие решения, у меня работает scrollToFirstRow ()
  • 0
    Это идеальное решение - scrollToFirstRow
Показать ещё 1 комментарий
26

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

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

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

11

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

Взяв содержимое вставки, вы получите это вместо:

[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];
  • 1
    Спасибо, я продолжал устанавливать его в CGPointZero и не мог понять, почему это происходит.
9

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

CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin = [tableinstacne convertPoint:cellRect.origin 
                                    fromView:<tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];
  • 0
    Это был самый простой код, и он работал нормально. Я на самом деле поставил CGPointMake (0.0f, 0.0f). Ура!
  • 0
    Этот код очень полезен для прокрутки раздела
8

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

Swift:

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

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

tableView.scrollToTop(animated: true)
8

Swift:

tableView.setContentOffset(CGPointZero, animated: true)
6

Swift:

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

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

если так:

tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height   + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
3

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)
  • 1
    Нет, если у вас есть tableHeaderView в вашем tableView, и он встроенный (прокручивает содержимое)
  • 0
    У меня есть и обычный и UITableViewStyleGrouped (заголовки прокручивается с содержимым), и этот код работает. Убедитесь, что вы находитесь в главном потоке, и вы запускаете этот код после появления представления ( viewDidAppear ). Если у вас все еще есть проблемы, попробуйте поместить код в это: DispatchQueue.main.asyncAfter(deadline: .now()+0.1, execute: { // the code }
Показать ещё 2 комментария
3

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

tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
  • 0
    Это была часть, которую мне не хватало.
3

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

Swift 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)
}
  • 0
    это было более полезным для меня
  • 0
    отличный ответ, ценю это
1

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

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

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

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

// from yourViewController or yourTableViewController
tableView.scrollToTop()
  • 0
    Отличная редакция, MobileMon!
1

Вот что я использую для корректной работы на 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)
    }
}
  • 1
    Это должен быть принятый ответ.
1

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

tableView.scrollToRow(at: NSIndexPath.init(row: 0, section: 0) as IndexPath, at: .top, animated: true)
1

Вот код для ScrollTableView To Top Programatically

Swift:

self.TableView.setContentOffset(CGPointMake(0, 1), animated:true)
1

Мне пришлось добавить умножить на -1 * на сумму строки состояния и панели навигации, потому что она выходила за эту высоту с экрана,

self.tableView.setContentOffset(CGPointMake(0 , -1 * 
  (self.navigationController!.navigationBar.height +  
  UIApplication.sharedApplication().statusBarFrame.height) ), animated:true)
0

Чтобы завершить завершение, добавьте это расширение

// MARK: - UIScrollView

extension UIScrollView {

    /// Animate scroll to top with completion
    ///
    /// - Parameters:
    ///   - duration:   TimeInterval
    ///   - completion: Completion block
    func animateScrollToTop(withDuration duration:  TimeInterval,
                            completion:             @escaping (()->())) {

        UIView.animate(withDuration: duration, animations: { [weak self] in
                self?.setContentOffset(CGPoint.zero, animated: false)
            }, completion: { finish in
                guard finish else {
                    return
                }
                completion()
        })
    }
}

tableView.animateScrollToTop(withDuration: 0.25) { 
    // Finish
}
0

С Swift:

self.scripSearchView.quickListTbl?.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
0

В Swift-3:

self.tableView.setContentOffset(CGPoint.zero, animated: true)
0
func scrollToTop() {
        NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0];
        [tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

вызывать эту функцию везде, где вы хотите, чтобы UITableView прокручивался вверх

0

в быстрой

ваша строка = selectioncellRowNumber ваш раздел, если у вас есть = selectionNumber, если вы не установили нулевое значение

//UITableViewScrollPosition.Middle или Bottom or Top

var lastIndex = NSIndexPath(forRow:  selectioncellRowNumber, inSection: selectionNumber)
self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Middle, animated: true)
0

Если вы хотите переместить анимацию прокрутки в таблицу, используйте этот код. Прокрутка перемещается в начало с анимацией за 0,5 секунды.

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

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

[UIView commitAnimations];
-2

Используйте этот код для реализации UITableview в swift:

var cell = tableView.dequeueReusableCellWithIdentifier("cell")
if cell == nil {
    cell = UITableViewCell(style: .Value1, reuseIdentifier: "cell")
}
  • 4
    Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
  • 0
    Вопрос заключался в том, как прокрутить UITableView наверх. Этот пост не отвечает на вопрос.
-23

Если вы не хотите прокрутки, вы можете запустить и остановить прокручивающую анимацию сразу после ее запуска.

    $('document').ready(function() {
    $("html, body").animate({ scrollTop: 0 }, 500);
    return true;
    });

Кроме того, чтобы оживить значения put для 'x' и 'y', прохождение в 0,0 будет прокручивать страницу до верхнего левого момента.

window.scrollTo(x, y);
  • 8
    UITableView -> iOS .......
  • 1
    HAHA! Это сделал мой день: о)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню