Tengo un UITableView
que se rellena con celdas de altura variable. Me gustaría que la tabla se desplace hacia abajo cuando la vista aparece.
Actualmente tengo la siguiente función
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
log es una matriz mutable que contiene los objetos que componen el contenido de cada celda.
El código anterior funciona bien, viewDidAppear
sin embargo, esto tiene el desafortunado efecto secundario de mostrar la parte superior de la tabla cuando aparece la vista por primera vez y luego saltar a la parte inferior. Preferiría que se table view
pudiera desplazar hasta el fondo antes de que aparezca.
Probé el desplazamiento viewWillAppear
y, viewDidLoad
en ambos casos, los datos aún no se han cargado en la tabla y ambos arrojan una excepción.
Cualquier orientación sería muy apreciada, incluso si solo se trata de decirme que lo que tengo es todo lo que es posible.
fuente
[table reloadData];
CGPoint(x: 0, y: tableView.contentSize.height)
?Creo que la forma más fácil es esta:
Versión Swift 3:
fuente
messages.count
por el ya implementadomyTableView.dataSource!.tableView(myTableView, numberOfRowsInSection: 0)
. Sí, es más largo, pero podría evitar la repetición del código. También debe manejar lo opcionaldataSource
(no fuerce el desenvolvimiento como en esta muestra).De la respuesta de Jacob , este es el código:
fuente
UIEdgeInsetsInsetRect(self.messagesTableView.frame, self.messagesTableView.safeAreaInsets).height
Si necesita desplazarse al extremo EXACTO del contenido, puede hacerlo así:
fuente
yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
? Gracias.self.tableView.contentSize.height
contenido de la vista de tabla puede no estar visible, porque se desplaza debajo del contenido. Por lo tanto, debe desplazarse a un "espacio de vista de tabla visible" sobre el final de la vista de tabla.Estoy usando autolayout y ninguna de las respuestas funcionó para mí. Aquí está mi solución que finalmente funcionó:
fuente
setContentOffset
en otro momento cuando se recuperaron los datos y se volvió a cargar la vista de tabla?CGFLOAT_MAX
, usécontentSize.height - frame.height + contentInset.bottom
al configurar el desplazamiento de contenido inicial. Usar meCGFLOAT_MAX
pareció un desastre.La solución aceptada por @JacobRelkin no funcionó para mí en iOS 7.0 usando Auto Layout.
Tengo una subclase personalizada de
UIViewController
y agregué una variable de instancia_tableView
como una subvista de suview
. Me posicioné_tableView
usando Auto Layout. Intenté llamar a este método al finalviewDidLoad
e incluso enviewWillAppear:
. Ninguno funcionó.Entonces, agregué el siguiente método a mi subclase personalizada de
UIViewController
.Llamando
[self tableViewScrollToBottomAnimated:NO]
al final de lasviewDidLoad
obras. Desafortunadamente, también hacetableView:heightForRowAtIndexPath:
que lo llamen tres veces por cada célula.fuente
Aquí hay una extensión que implementé en Swift 2.0. Estas funciones deben invocarse después de que
tableview
se haya cargado:fuente
Detalles
Código
Uso
Muestra completa
fuente
En realidad, una forma "más rápida" de hacerlo con rapidez es:
trabajo perfecto para mi.
fuente
Quería que la tabla se cargara con el final de la tabla que se muestra en el marco. Encontré usando
no funcionó porque dio un error cuando la altura de la mesa era menor que la altura del marco. Tenga en cuenta que mi tabla solo tiene una sección.
La solución que funcionó para mí fue implementar el siguiente código en viewWillAppear:
BOOL ivar initialLoad se establece en TRUE en viewDidLoad.
fuente
scrollToRowAtIndexPath
? Ya estás llamandosetContentOffset
después, lo que podría hacer que esa primera llamada no tenga sentido.Para Swift:
fuente
Deberías usar
UITableViewScrollPositionBottom
en su lugar.fuente
Para Swift 3 (Xcode 8.1):
fuente
Es, por supuesto, un error. Probablemente en algún lugar de su código que use
table.estimatedRowHeight = value
(por ejemplo, 100). Reemplace este valor por el valor más alto que cree que podría obtener una altura de fila , por ejemplo 500 .. Esto debería resolver el problema en combinación con el siguiente código:fuente
Después de mucho violín, esto es lo que funcionó para mí:
La clave resultó no estar envuelta en el
scrollToRowAtIndexPath
interiordispatch_async
como algunos han sugerido, sino simplemente seguirla con una llamada alayoutIfNeeded
.Según tengo entendido, llamar al método de desplazamiento en el hilo actual garantiza que el desplazamiento de desplazamiento se establezca inmediatamente, antes de que se muestre la vista. Cuando estaba enviando al hilo principal, la vista se mostraba por un instante antes de que el desplazamiento entrara en vigor.
(También NB necesita la
viewHasAppeared
bandera porque no desea que se llamegoToBottom
cada vezviewDidLayoutSubviews
. Se llama, por ejemplo, cada vez que cambia la orientación).fuente
Usando las soluciones anteriores, esto se desplazará hasta la parte inferior de su tabla (solo si el contenido de la tabla se carga primero):
fuente
En Swift 3.0
fuente
Si tiene que cargar los datos de forma asincrónica antes de desplazarse hacia abajo, esta es la posible solución:
fuente
Función en swift 3 desplazarse hacia abajo
fuente
deberías agregar
o no se desplazará hasta el fondo.
fuente
Use este código simple para desplazarse por la tablaVer abajo
fuente
Gracias Jacob por la respuesta. realmente útil si alguien interesante con la versión monotouch c #
fuente
En iOS esto funcionó bien para mí
Necesita ser llamado desde
viewDidLayoutSubviews
fuente
[self.tableViewInfo scrollRectToVisible: CGRectMake (0, self.tableViewInfo.contentSize.height-self.tableViewInfo.height, self.tableViewInfo.width, self.tableViewInfo.height) animado: SÍ];
fuente
La respuesta aceptada no funcionó con mi tabla (miles de filas, carga dinámica) pero el siguiente código funciona:
fuente
No es necesario desplazarse, puede hacerlo utilizando este código:
fuente
Si está configurando el marco para la vista de tabla mediante programación, asegúrese de configurar el marco correctamente.
fuente
En Swift, solo necesitas
para que se desplace automáticamente al botón
fuente
En swift 3.0 Si desea ir a cualquier Celda particular de vista de tabla Cambie el valor del índice de celda como cambiar el valor "self.yourArr.count".
fuente
Creo que las soluciones antiguas no funcionan con swift3.
Si conoce filas de números en la tabla, puede usar:
fuente