Ответ 1
Здесь вы можете сделать другой способ:
Objective-C
[tableView setContentOffset:CGPointZero animated:YES];
Swift 3
tableView.setContentOffset(.zero, animated: true)
Возможно, самый простой и самый прямой способ сделать это.
Я пытаюсь получить UITableview, чтобы перейти в начало страницы, когда я перезагружаю данные таблицы, когда вызываю из
следующее:- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
// A bunch of code …
[TableView reloadData];
}
В тех же строках я также хотел бы перейти к определенному разделу, когда я перезагружаю данные таблицы.
Я попытался разместить следующее, которое кажется применимым только к строке, до и после перезагрузки, но ничего не происходит:
[TableView scrollToRowAtIndexPath:0 atScrollPosition:UITableViewScrollPositionTop animated:YES];
Здесь вы можете сделать другой способ:
Objective-C
[tableView setContentOffset:CGPointZero animated:YES];
Swift 3
tableView.setContentOffset(.zero, animated: true)
Возможно, самый простой и самый прямой способ сделать это.
Чтобы перейти к определенному разделу, вам необходимо указать путь к нему:
NSIndexPath *topPath = [NSIndexPath indexPathForRow:0 inSection:0];
[TableView scrollToRowAtIndexPath:topPath
atScrollPosition:UITableViewScrollPositionTop
animated:YES];
Если вы не уверены в количестве строк в таблицеView. Используйте следующее:
NSIndexPath *topPath = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
[TableView scrollToRowAtIndexPath:topPath
atScrollPosition:UITableViewScrollPositionTop
animated:YES];
После прочтения всех ответов здесь и в другом месте, я наконец нашел решение, которое работает надежно и не показывает прокрутку после загрузки данных. Мой ответ основан на этом сообщении и моем наблюдении, что вам нужно отрицательное смещение, если вы используете вставки содержимого:
func reloadAndScrollToTop() {
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.contentOffset = CGPoint(x: 0, y: -tableView.contentInset.top)
}
UITableView является подклассом UIScrollView, поэтому вы также можете использовать:
[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
Если вы перейдете до перезагрузки и количество строк уменьшится, вы можете столкнуться с каким-то странным анимирующим поведением. Чтобы обеспечить прокрутку после перезагрузки, используйте такой метод:
- (void)reloadTableViewAndScrollToTop:(BOOL)scrollToTop {
[self.tableView reloadData];
if (scrollToTop) {
[self.tableView setContentOffset:CGPointZero animated:YES];
}
}
В быстрой версии 3.1
DispatchQueue.main.async(execute: {
self.TableView.reloadData()
self.TableView.contentOffset = .zero
})
Это работает для меня.
tableView.scrollToRow(at: IndexPath.init(row: 0, section: 0), at: .top, animated: true)