it-swarm.com.ru

Как прокрутить вверх в IOS7 UITableView?

В IOS6 у меня есть следующий код для прокрутки к вершине UITableView

[tableView setContentOffset:CGPointZero animated:YES];

В IOS7 это больше не работает. Табличное представление не полностью прокручено к вершине (но почти).

43
Markus Johansson

С помощью некоторых других ответов мне удалось заставить его работать. Чтобы избежать сбоя, я должен сначала проверить, что есть некоторые разделы. NsNotFound может использоваться как индекс строки, если в первом разделе нет строк. Надеюсь, это должна быть общая функция, которая будет помещена в UITableViewController:

-(void) scrollToTop
{
    if ([self numberOfSectionsInTableView:self.tableView] > 0)
    {
        NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
        [self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
}
16
Markus Johansson

В iOS7 компоненты UITableView и UIScrollView на весь экран по умолчанию настраивают вставки содержимого и индикатора прокрутки, чтобы все работало. Однако, как вы заметили, CGPointZero больше не представляет смещение содержимого, которое приводит вас к визуальной «вершине».

Используйте это вместо:

self.tableView.contentOffset = CGPointMake(0, 0 - self.tableView.contentInset.top);

Здесь вам не нужно беспокоиться о наличии разделов или строк. Вы также не говорите табличному представлению нацеливаться на первую строку, а затем удивляетесь, почему он не отображает все ваши очень высокие представления заголовка таблицы и т.д.

127
idStar

Попробуй это: 

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
23
Harikrishnan

На основании принятого ответа от @Markus Johansson, вот версия кода Swift:

func scrollToTop() {
    if (self.tableView.numberOfSections > 0 ) {
        let top = NSIndexPath(row: Foundation.NSNotFound, section: 0)
        self.tableView.scrollToRow(at: top as IndexPath, at: .top, animated: true);
    }
}
22
cashmash
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.sampleTableView.scrollToRowAtIndexPath(indexPath,
atScrollPosition: UITableViewScrollPosition.Top, animated: true)

или же 

self.sampleTableView.setContentOffset(CGPoint.zero, animated:false)
4
A.G

Вот/id - answer в обновленном синтаксисе Swift 3:

self.tableView.contentOffset = CGPoint(x: 0, y: 0 - self.tableView.contentInset.top)

С анимацией:

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

Свифт 3

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

self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false)
3
RiceAndBytes
float systemVersion= [[[UIDevice currentDevice] systemVersion] floatValue];

if(systemVersion >= 7.0f)
{
  self.edgesForExtendedLayout=UIRectEdgeNone;   
}

Попробуйте этот код в методе viewDidLoad().

3
Jitendra

Я понимаю, что на это ответили, но я просто хотел дать другой вариант:

CGRect frame = {{0, 0},{1, 1}};
[self.tableView scrollRectToVisible:frame animated:YES];

Это всегда гарантирует, что UITableView прокрутится до самого верха. Принятый ответ:

NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
[self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];

не работал для меня, потому что я прокручивал до tableHeaderView, а не ячейки. 

Использование scrollRectToVisible работает на iOS 6 и 7.

2
Chris

вы все еще можете использовать scrollToRowAtIndexPath: для этой цели

2
Lithu T.V

Swift 4 UITableViewExtension:

func scrollToTop(animated: Bool) {
    if numberOfSections > 0 {
        let topIndexPath = IndexPath(row: NSNotFound, section: 0)
        scrollToRow(at: topIndexPath, at: .top, animated: animated)
    }
}
1
Sunkas

в Swift я использовал: 

self.tableView.setContentOffset(CGPointMake(0, 0), animated: true)

но @Alvin George's прекрасно работает 

0
SpyZip