UITableView, прокрутите вниз до перезагрузки?
У меня есть UITableView
с динамически обновляемыми cells
. Все отлично работает, когда вызывается tableview.reload
(см. Ниже), чтобы обновить cells
в таблице. Мне бы хотелось, чтобы таблица прокручивалась вниз, чтобы отображать новые записи.
- (void)reloadTable:(NSNotification *)notification { NSLog(@"RELOAD TABLE ..."); [customTableView reloadData]; // Scroll to bottom of UITable here .... }
Я планировал использовать scrollToRowAtIndexPath:atScrollPosition:animated:
но потом заметил, что у меня нет доступа к indexPath
.
Кто-нибудь знает, как это сделать, или обратного вызова delegate
который я мог бы использовать?
- UITextField: перемещение вида при появлении клавиатуры
- Изменить цвет курсора в UITextField
- Как скопировать объект в объекте c
- Возвратитесь к поведению приложения после разговора по телефону в собственном коде, чем UIWebView
- drawRect не вызывается в моем подclassе UIImageView
- Использование хеша MD5 в строке в cocoa?
- Восстановить пре-iOS7 UINavigationController pushViewController animation
- Как отправить данные json в запрос Http с помощью NSURLRequest
- Метод sizeWithFont устарел. boundingRectWithSize возвращает неожиданное значение
- Плохой URL-адрес при запросе с помощью NSURL
- Как отобразить изображение base64 в UIImageView?
- NSMutableArray addObject не влияет на счет?
- XCode 4 зависает при «Присоединении к (имя приложения)»
Использование:
NSIndexPath* ipath = [NSIndexPath indexPathForRow: cells_count-1 inSection: sections_count-1]; [tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionTop animated: YES];
Или вы можете указать индекс раздела вручную (если один раздел => индекс = 0).
-(void)scrollToBottom{ [self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES]; }
Другое решение – перевернуть стол по вертикали и перевернуть каждую ячейку по вертикали:
При инициализации примените преобразование к UITableView:
tableview.transform = CGAffineTransformMakeScale(1, -1);
и в cellForRowAtIndexPath:
cell.transform = CGAffineTransformMakeScale(1, -1);
Таким образом, вам не нужны обходные пути для прокрутки, но вам нужно будет немного подумать о contentInsets / contentOffsets и взаимодействиях header / footer.
//In swift var iPath = NSIndexPath(forRow: self.tableView.numberOfRowsInSection(0)-1, inSection: self.tableView.numberOfSections()-1) self.tableView.scrollToRowAtIndexPath(iPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: true)
Это еще одно решение, хорошо работающее в моем случае, когда высота ячейки велика.
- (void)scrollToBottom { CGPoint bottomOffset = CGPointMake(0, _bubbleTable.contentSize.height - _bubbleTable.bounds.size.height); if ( bottomOffset.y > 0 ) { [_bubbleTable setContentOffset:bottomOffset animated:YES]; } }
Поскольку это то, что вы, возможно, захотите использовать очень часто, я предлагаю вам создать расширение classа в UITableView:
extension UITableView { func scrollToBottom(animated: Bool = true) { let section = self.numberOfSections if section > 0 { let row = self.numberOfRowsInSection(section - 1) if row > 0 { self.scrollToRowAtIndexPath(NSIndexPath(forRow: row - 1, inSection: section - 1), atScrollPosition: .Bottom, animated: animated) } } } }
расширение лучше делать в UIScrollView вместо UITableView, таким образом он работает на scrollView, tableView, collectionView (вертикальный), UIWebView (внутренний просмотр прокрутки) и т. д.
public extension UIScrollView { public func scrollToBottom(animated animated: Bool) { let rect = CGRectMake(0, contentSize.height - bounds.size.height, bounds.size.width, bounds.size.height) scrollRectToVisible(rect, animated: animated) } }
Это лучший способ.
- (void)scrollToBottom { CGFloat yOffset = 0; if (self.tableView.contentSize.height > self.tableView.bounds.size.height) { yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height; } [self.tableView setContentOffset:CGPointMake(0, yOffset) animated:NO]; }
попробуйте этот код, он может вам помочь:
self.tableView.reloadData() DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+0.1, execute: { let indexPath = IndexPath(row: self.dateSource.count-1, section: 0) self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: true) })
Swift 3
Для всех людей, пытающихся выяснить, как решить эту проблему, ключом является вызов .layoutIfNeeded()
после .reloadData()
:
tableView.reloadData() tableView.layoutIfNeeded() tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentSize.height - tableView.frame.height), animated: false)
Я работал с несколькими разделами в UITableView
и он работал хорошо.