2009-04-07 2 views
319

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

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

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

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

ответ

727

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

Работал для меня тоже, даже с таблицейHeaderView –

+0

спасибо. Я просто добавил, что в моей строке 'scrollToRowAtIndexPath' и теперь прокрутка работает нормально. – Nasenbaer

231

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

[mainTableView setContentOffset:CGPointZero animated:YES]; 

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

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

Помидор, помидор. Хм ... Это не очень ясно написано в письменной форме. – FreeAsInBeer

+14

Это лучший способ использования, когда у вас есть представление заголовка таблицы или нижнего колонтитула, а также их включение. – mafonya

+4

Это действительно чистый код, но он не работает, когда ваш 'tableView' имеет ненулевой' contentInset' сверху. Например: 'tableView.contentInset = UIEdgeInsetsMake (5.0f, 0.0f, 250.0f, 0.0f);'. Если это так, в вашем коде 'tableView' прокручивается до' (0.0f, 5.0f) '. – tolgamorf

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). Ура! – Felipe

+0

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

25

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

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

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

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]; 
-22

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

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

Кроме того, для анимации пут значения «х» и «у», проходящей в 0,0 будет прокручивать страницу в левом верхнем углу мгновенно.

window.scrollTo(x, y); 
+8

UITableView -> iOS ....... –

+1

HAHA! Это сделало мой день: o) –

+1

Hahahahhahaha это заставило меня смеяться в первый раз сегодня! : D –

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) 
12

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

Принимая содержание врезки в счет производит вместо этого:

[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO]; 
+1

Спасибо, я продолжал устанавливать его в CGPointZero и не мог понять, почему это происходит. – johnrechd

0

в быстрой

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

//UITableViewScrollPosition.Средний или нижний или верхний

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

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

Swift:

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

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

tableView.scrollToTop(animated: true) 
1

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

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

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

func scrollToFirstRow() { 
    let indexPath = NSIndexPath(forRow: 0, inSection: 0) 
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true) 
} 
func scrollToLastRow() { 
    let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0) 
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true) 
} 
func scrollToSelectedRow() { 
    let selectedRows = self.tableView.indexPathsForSelectedRows 
    if let selectedRow = selectedRows?[0] as? NSIndexPath { 
     self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true) 
    } 
} 
func scrollToHeader() { 
    self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true) 
} 
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) 
    } 
+4

Хорошие решения, scrollToFirstRow() работает для меня –

+0

Thats the solution, perfect - scrollToFirstRow – Mehul

+0

Отличное резюме. Когда у вас есть заголовки разделов, вам придется использовать option4 scrollToHeader. – Vincent

1
func scrollToTop() { 
     NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0]; 
     [tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 

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

1

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

Swift:

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

В Свифта-3:

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

С моей 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

отличный ответ, оцените его –

-2

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

var cell = tableView.dequeueReusableCellWithIdentifier(“cell”) 
if cell == nil { 
    cell = UITableViewCell(style: .Value1, reuseIdentifier: “cell”) 
} 
+4

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based -answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. –

+0

Вопрос в том, как прокрутить UITableView до вершины. Это сообщение не отвечает на вопрос. – Pang

0

С Swift:

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

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

tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true) 
+0

Это была та часть, которую мне не хватало. –

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 
} 
1

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

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

табличного представление Вот что я использую, чтобы правильно работать на прошивке 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) 
    } 
} 
2

я столкнулся вопрос, призывающим пытаемся некоторые из методов по принципу пустой 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() 
7

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) 
2

Swift 3

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

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

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

tableView.beginUpdates() 
tableView.setContentOffset(CGPoint.zero, animated: true) 
tableView.endUpdates() 
2

КСН 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) 
} 
1

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

extension UITableView { 
    func scrollToTop(animated: Bool) { 
     self.setContentOffset(CGPoint.zero, animated: animated); 
    } 
} 
Смежные вопросы