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

369
задан Leo Dabus 6 November 2017 в 04:56
поделиться

32 ответа

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

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

Или

[mainTableView setContentOffset:CGPointZero animated:YES];

И в Swift:

mainTableView.setContentOffset(CGPointZero, animated:true)

И в Swift 3 & amp; выше:

mainTableView.setContentOffset(.zero, animated: true)
814
ответ дан aashish tamsya 6 November 2017 в 04:56
поделиться

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

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

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

window.scrollTo(x, y);
-26
ответ дан Pankaj Manjhi 6 November 2017 в 04:56
поделиться

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

var cell = tableView.dequeueReusableCellWithIdentifier(“cell”)
if cell == nil {
    cell = UITableViewCell(style: .Value1, reuseIdentifier: “cell”)
}
-3
ответ дан anacron 6 November 2017 в 04:56
поделиться

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

// 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
ответ дан YannSteph 6 November 2017 в 04:56
поделиться

С помощью Swift:

self.scripSearchView.quickListTbl?.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
0
ответ дан Aurasphere 6 November 2017 в 04:56
поделиться

в быстром

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

// UITableViewScrollPosition.Middle или Bottom или Top

var lastIndex = NSIndexPath(forRow:  selectioncellRowNumber, inSection: selectionNumber)
self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Middle, animated: true)
0
ответ дан Daniel Galasko 6 November 2017 в 04:56
поделиться

Если вы хотите переместить анимацию прокрутки в таблицу, используйте этот код. Прокрутка переместится наверх с анимацией за 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];
0
ответ дан Matheus Veloza 6 November 2017 в 04:56
поделиться

Я использую tabBarController, и у меня есть несколько разделов в табличном представлении на каждой вкладке, так что это лучшее решение для меня.

extension UITableView {

    func scrollToTop(){

        for index in 0...numberOfSections - 1 {
            if numberOfSections > 0 && numberOfRows(inSection: index) > 0 {
                scrollToRow(at: IndexPath(row: 0, section: index), at: .top, animated: true)
                break
            }

            if index == numberOfSections - 1 {
                setContentOffset(.zero, animated: true)
                break
            }
        }

    }

}
1
ответ дан Okan 6 November 2017 в 04:56
поделиться

В Swift-3:

self.tableView.setContentOffset(CGPoint.zero, animated: true)
1
ответ дан Jeni Khant 6 November 2017 в 04:56
поделиться

Вот код для прокрутки табличного представления в верх программно

Swift:

self.TableView.setContentOffset(CGPointMake(0, 1), animated:true)
1
ответ дан Kavin Kumar Arumugam 6 November 2017 в 04:56
поделиться
func scrollToTop() {
        NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0];
        [tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

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

.
1
ответ дан Sayali Shinde 6 November 2017 в 04:56
поделиться

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

self.tableView.setContentOffset(CGPointMake(0 , -1 * 
  (self.navigationController!.navigationBar.height +  
  UIApplication.sharedApplication().statusBarFrame.height) ), animated:true)
1
ответ дан Rohit Gupta 6 November 2017 в 04:56
поделиться

В Swift 5 большое спасибо @ Adrian за ответ

extension UITableView{

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

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

}

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

tableView.scrollToTop()
2
ответ дан dengST30 6 November 2017 в 04:56
поделиться

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

extension UITableView {
    func scrollToTop(animated: Bool) {
        self.setContentOffset(CGPoint.zero, animated: animated);
    }
}
2
ответ дан Shawn 6 November 2017 в 04:56
поделиться

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

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 - высота моего заголовка и ячейки табличного представления

3
ответ дан jimmyruby 6 November 2017 в 04:56
поделиться

Вот что я использую для корректной работы на 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
ответ дан Hans Brende 6 November 2017 в 04:56
поделиться

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

tableView.scrollToRow(at: NSIndexPath.init(row: 0, section: 0) as IndexPath, at: .top, animated: true)
3
ответ дан Gulz 6 November 2017 в 04:56
поделиться

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

tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
5
ответ дан Jacob Caraballo 6 November 2017 в 04:56
поделиться

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

[mainTableView setContentOffset:CGPointZero animated:YES];

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

[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];
242
ответ дан fabb 6 November 2017 в 04:56
поделиться

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

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)
  }
68
ответ дан Adrian 6 November 2017 в 04:56
поделиться

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

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

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

26
ответ дан Kof 6 November 2017 в 04:56
поделиться

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)
20
ответ дан Alessandro Ornano 6 November 2017 в 04:56
поделиться

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

Принимая во внимание содержание содержимого, получается вместо этого:

[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];
12
ответ дан EI Captain v2.0 6 November 2017 в 04:56
поделиться

Я столкнулся с проблемой вызова некоторых методов на пустом 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
11
ответ дан MobileMon 6 November 2017 в 04:56
поделиться

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

CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin = [tableinstacne convertPoint:cellRect.origin 
                                    fromView:<tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];
.
10
ответ дан dreamzor 6 November 2017 в 04:56
поделиться

Свифт:

tableView.setContentOffset(CGPointZero, animated: true)
8
ответ дан Esqarrouth 6 November 2017 в 04:56
поделиться

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

 tableView.setContentOffset(.zero, animated: true)

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

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

 tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
9
ответ дан ScottyBlades 6 November 2017 в 04:56
поделиться

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

Swift:

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

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

tableView.scrollToTop(animated: true)
8
ответ дан ocwang 6 November 2017 в 04:56
поделиться

Свифт 3

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

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

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

tableView.beginUpdates()
tableView.setContentOffset(CGPoint.zero, animated: true)
tableView.endUpdates()
7
ответ дан Исмаил Хасбулатов 6 November 2017 в 04:56
поделиться

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)
6
ответ дан jmcastel 6 November 2017 в 04:56
поделиться