iphone - source - uitableviewcell swift 3
UITableView, desplácese hacia abajo al volver a cargar? (10)
Como esto es algo que quizás quieras usar muy a menudo, te sugiero que crees una extensión de clase en 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)
}
}
}
}
Tengo una UITableView
con cells
que se actualizan dinámicamente. Todo funciona bien, aparte de cuando se llama a tableview.reload
(ver a continuación) para actualizar las cells
de la tabla. Me gustaría que la tabla se desplace hacia abajo para mostrar las nuevas entradas.
- (void)reloadTable:(NSNotification *)notification {
NSLog(@"RELOAD TABLE ...");
[customTableView reloadData];
// Scroll to bottom of UITable here ....
}
Estaba planeando usar scrollToRowAtIndexPath:atScrollPosition:animated:
pero luego noté que no tengo acceso a un indexPath
.
¿Alguien sabe cómo hacer esto, o de una devolución de llamada delegate
que podría usar?
Esta es la mejor manera.
- (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];
}
Esta es otra solución, funcionó bien en mi caso, cuando la altura de la celda es grande.
- (void)scrollToBottom
{
CGPoint bottomOffset = CGPointMake(0, _bubbleTable.contentSize.height - _bubbleTable.bounds.size.height);
if ( bottomOffset.y > 0 ) {
[_bubbleTable setContentOffset:bottomOffset animated:YES];
}
}
Otra solución es voltear la mesa verticalmente y voltear cada celda verticalmente:
Aplica la transformación a UITableView al inicializar:
tableview.transform = CGAffineTransformMakeScale(1, -1);
y en cellForRowAtIndexPath:
cell.transform = CGAffineTransformMakeScale(1, -1);
De esta manera, no necesita soluciones para desplazarse por problemas, pero deberá pensar un poco más acerca de las interacciones contentInsets / contentOffsets y header / footer.
Utilizar:
NSIndexPath* ipath = [NSIndexPath indexPathForRow: cells_count-1 inSection: sections_count-1];
[tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionTop animated: YES];
O puede especificar el índice de sección manualmente (Si una sección => índice = 0).
la extensión es mejor para hacer en UIScrollView en lugar de UITableView, de esta manera funciona en scrollView, tableView, collectionView (vertical), UIWebView (vista de desplazamiento interno), etc.
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)
}
}
prueba este código, puede ayudarte:
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
Para todas las personas que intentan encontrar la manera de resolver este problema, la clave es llamar al método .reloadData()
después de .reloadData()
:
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentSize.height - tableView.frame.height), animated: false)
Estaba trabajando con múltiples secciones en UITableView
y funcionó bien.
-(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];
}
//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)