В IOS6 у меня есть следующий код для прокрутки вверху UITableView
[tableView setContentOffset:CGPointZero animated:YES];
В IOS7 это больше не работает. Вид таблицы не прокручивается полностью вверх (но почти).
В IOS6 у меня есть следующий код для прокрутки вверху UITableView
[tableView setContentOffset:CGPointZero animated:YES];
В IOS7 это больше не работает. Вид таблицы не прокручивается полностью вверх (но почти).
С помощью некоторых других ответов здесь мне удалось заставить его работать. Чтобы избежать сбоя, я должен сначала проверить, есть ли какие-то разделы. 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];
}
}
В iOS7 все компоненты UITableView и UIScrollView на весь экран по умолчанию настраивают содержимое и прокручивают вставки индикаторов, чтобы заставить все работать. Однако, как вы заметили, CGPointZero больше не представляет смещение содержимого, которое приводит вас к визуальному "верхнему".
Используйте это вместо:
self.tableView.contentOffset = CGPointMake(0, 0 - self.tableView.contentInset.top);
Здесь вам не нужно беспокоиться о том, есть ли у вас разделы или строки. Вы также не указываете Table View на таргетинг на первую строку, а затем задаетесь вопросом, почему она не отображает весь ваш высокий заголовок таблицы и т.д.
Попробуйте следующее:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Основываясь на принятом ответе от @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);
}
}
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.sampleTableView.scrollToRowAtIndexPath(indexPath,
atScrollPosition: UITableViewScrollPosition.Top, animated: true)
или
self.sampleTableView.setContentOffset(CGPoint.zero, animated:false)
float systemVersion= [[[UIDevice currentDevice] systemVersion] floatValue];
if(systemVersion >= 7.0f)
{
self.edgesForExtendedLayout=UIRectEdgeNone;
}
Попробуйте этот код в методе viewDidLoad()
.
Swift 3
Если у вас есть заголовки табличного представления, CGPointZero может не работать для вас, но это всегда делает трюк для прокрутки вверх.
self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false)
вы можете использовать scrollToRowAtIndexPath:
для этой цели
Я понимаю, что на это был дан ответ, но я просто хотел дать еще один вариант:
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.
Вот idStar 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)
в swift я использовал:
self.tableView.setContentOffset(CGPointMake(0, 0), animated: true)
но @Алвин Джордж отлично работает
Swift 4 UITableViewExtension:
func scrollToTop(animated: Bool) {
if numberOfSections > 0 {
let topIndexPath = IndexPath(row: NSNotFound, section: 0)
scrollToRow(at: topIndexPath, at: .top, animated: animated)
}
}