UITableView - прокрутите вверх
В моем представлении таблицы мне нужно прокрутить вверх. Но я не могу гарантировать, что первым объектом будет раздел 0, строка 0. Может быть, мой вид таблицы начнется с раздела 5.
Итак, я получаю исключение, когда я звоню:
[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
Есть ли другой способ прокрутки до верхней части таблицы?
Ответы
Ответ 1
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)
Ответ 2
Примечание. Этот ответ не подходит для iOS 11 и более поздних версий.
Я предпочитаю
[mainTableView setContentOffset:CGPointZero animated:YES];
Если у вас есть верхняя вставка в табличном представлении, вы должны вычесть ее:
[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];
Ответ 3
Возможные действия:
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)
}
Ответ 4
Лучше не использовать NSIndexPath (пустую таблицу) и не предполагать, что верхняя точка - это CGPointZero (вставки содержимого), что я использую -
[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];
Надеюсь, что это поможет.
Ответ 5
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)
Ответ 6
В 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)
}
Ответ 7
Для таблиц с contentInset
установка смещения содержимого CGPointZero
не будет работать. Он переместится в верхнюю часть контента или прокрутку к верхней части таблицы.
Взяв содержимое вставки, вы получите это вместо:
[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];
Ответ 8
Я столкнулся с проблемой вызова некоторых методов на пустом 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
Ответ 9
НЕ ИСПОЛЬЗУЙТЕ
tableView.setContentOffset(.zero, animated: true)
Иногда может неправильно установить смещение. Например, в моем случае, ячейка была немного выше обзора со вставками безопасной зоны. Нехорошо.
ВМЕСТО ИСПОЛЬЗОВАНИЯ
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
Ответ 10
Этот код позволяет прокручивать определенный раздел вверх
CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin = [tableinstacne convertPoint:cellRect.origin
fromView:<tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];
Ответ 11
Swift:
tableView.setContentOffset(CGPointZero, animated: true)
Ответ 12
Добавив к уже сказанному, вы можете создать расширение (Swift) или категорию (Objective C), чтобы сделать это проще в будущем:
Swift:
extension UITableView {
func scrollToTop(animated: Bool) {
setContentOffset(CGPointZero, animated: animated)
}
}
В любое время, когда вы хотите прокрутить любую таблицу TableView вверху, вы можете вызвать следующий код:
tableView.scrollToTop(animated: true)
Ответ 13
Так как мой 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)
}
Ответ 14
Свифт 3
tableView.setContentOffset(CGPoint.zero, animated: true)
если tableView.setContentOffset
не работает.
Использование:
tableView.beginUpdates()
tableView.setContentOffset(CGPoint.zero, animated: true)
tableView.endUpdates()
Ответ 15
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)
Ответ 16
Я предпочитаю следующее, так как он учитывает вставку. Если нет вставки, она все равно будет прокручиваться вверх, так как вставка будет 0.
tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
Ответ 17
Вот что я использую для корректной работы на 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)
}
}
Ответ 18
использование contentOffset - неправильный путь. это было бы лучше, так как это естественный вид таблицы.
tableView.scrollToRow(at: NSIndexPath.init(row: 0, section: 0) as IndexPath, at: .top, animated: true)
Ответ 19
Swift 4 через расширение, обрабатывает пустой вид таблицы:
extension UITableView {
func scrollToTop(animated: Bool) {
self.setContentOffset(CGPoint.zero, animated: animated);
}
}
Ответ 20
Это был единственный фрагмент кода, который работал для меня
Свифт 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)
PS 70 - высота моего заголовка и ячейки табличного представления
Ответ 21
В 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()
Ответ 22
Мне пришлось добавить умножить на -1 *
на сумму строки состояния и панели навигации, потому что она выходила за эту высоту с экрана,
self.tableView.setContentOffset(CGPointMake(0 , -1 *
(self.navigationController!.navigationBar.height +
UIApplication.sharedApplication().statusBarFrame.height) ), animated:true)
Ответ 23
func scrollToTop() {
NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0];
[tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
вызывать эту функцию везде, где вы хотите, чтобы UITableView прокручивался вверх
Ответ 24
Вот код для ScrollTableView To Top Programatically
Swift:
self.TableView.setContentOffset(CGPointMake(0, 1), animated:true)
Ответ 25
В Swift-3:
self.tableView.setContentOffset(CGPoint.zero, animated: true)
Ответ 26
Я использую 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
}
}
}
}
Ответ 27
Если вы хотите переместить анимацию прокрутки в таблицу, используйте этот код. Прокрутка перемещается в начало с анимацией за 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];
Ответ 28
в быстрой
ваша строка = selectioncellRowNumber
ваш раздел, если у вас есть = selectionNumber, если вы не установили нулевое значение
//UITableViewScrollPosition.Middle или Bottom or Top
var lastIndex = NSIndexPath(forRow: selectioncellRowNumber, inSection: selectionNumber)
self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Middle, animated: true)
Ответ 29
С Swift:
self.scripSearchView.quickListTbl?.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
Ответ 30
Чтобы завершить завершение, добавьте это расширение
// 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
}