Cómo deshabilitar el desplazamiento en la tabla UITableView cuando el contenido cabe en la pantalla

240

Tengo algunas tablas (estilo agrupado) en mi aplicación de iPhone (solo en una parte de la pantalla y agregué sin Interface Builderembargo, no subclasificadas UITableViewController) que el 80% del tiempo son pequeñas y caben en la pantalla. Cuando la tabla cabe en la pantalla, me gustaría deshabilitar el desplazamiento, para que quede un poco más limpio. Pero si la tabla se sale de la pantalla (cuando más tarde se le agregan filas), me gustaría habilitar el desplazamiento nuevamente (porque de lo contrario no podrá ver ese contenido).

¿Hay alguna forma de hacer esto? Parece que no puedo entenderlo. Yo sé hacer:

tableView.scrollEnabled = NO;

pero no estoy seguro de dónde, o si tengo que calcular el tamaño del objeto de la tabla o algo para que esto funcione.


Actualización : Aquí está la solución que finalmente funcionó para mí:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

Ejecuto este código después de llamar reloadDataa la tabla, y calcula los tamaños correctos y parece funcionar.

table.frame.size.heightes el tamaño real del objeto (puede ver esto en Interface Builder) que se muestra en la pantalla, mientras table.contentSize.heightque las alturas de: el encabezado, el pie de página y la altura de cada celda se suman.

Ginny
fuente
1
Gracias. Esa solución funcionó para mí. Sin embargo, terminé extendiendo UITableView y reemplazando reloadData para deshabilitar scrollEnabled. La razón es que la vista de tabla se carga cuando se crea mi controlador de vista. De esa manera no tiene que llamar a reloadData dos veces.
Brandon O'Rourke
@ JoeBlow Creo que te perdiste el punto de OP. La pregunta no es cómo deshabilitar el rebote, sino cómo habilitar el desplazamiento (y el rebote, muy probablemente) cuando la vista de tabla necesita desplazarse.
Kyle Clegg
Tal vez sea mejor usar límites, porque creo que si giras un poco tu tabla, frame.height va a cambiar.
Ricardo
Debería haber: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski el

Respuestas:

396

Creo que quieres configurar

tableView.alwaysBounceVertical = NO;
Lily Ballard
fuente
66
Esto funciona mejor que contentSize <frame cuando usa AutoLayout. Se debe aceptar la respuesta.
Joshua Dance
1
Estoy usando el diseño automático y esta respuesta es exactamente lo que necesito.
Golden Thumb
3
mejor que deshabilitar el desplazamiento
Kirit Vaghela
55
funciona como un encanto, también puede deshabilitarlo interface builderdesmarcando rebote y rebote horizontal / verticalmente.
Ahsan Ebrahim
11
para Swift - tableView.alwaysBounceVertical = false
swiftBoy
44

Puede verificar el número de celdas visibles con esta función:

- (NSArray *)visibleCells

Este método devolverá una matriz con las celdas que están visibles, por lo que puede contar la cantidad de objetos en esta matriz y comparar con la cantidad de objetos en su tabla ... si es igual ... puede deshabilitar el desplazamiento usando:

tableView.scrollEnabled = NO;

Como mencionó @Ginny ... podríamos tener problemas con las celdas parcialmente visibles, por lo que esta solución funciona mejor en este caso:

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

En caso de que esté usando autoLayout, esta solución hace el trabajo:

tableView.alwaysBounceVertical = NO.
Roberto Ferraz
fuente
¡Gracias! Esto está funcionando principalmente para mí ahora. El único problema que tengo ahora es que cuando las celdas están parcialmente visibles todavía cuentan como visibles y, por lo tanto, el desplazamiento se deshabilita cuando en ese caso quiero que esté habilitado.
Ginny
66
¡Lo averigué! Resulta que realmente no puedes usar visibleCells en absoluto, debido al problema de la celda parcialmente visible, pero esto funciona: if (table.contentSize.height < table.frame.size.height)>> ver edición en la publicación original.
Ginny
42

En Swift:

tableView.alwaysBounceVertical = false
Natividad Lara Diaz
fuente
18
Siempre voté como "reescribe" tales a̶n̶s̶w̶e̶r̶s̶ porque la conversión a la sintaxis moderna requiere tiempo.
Dmitry Isaev
14

Por lo tanto, hay varias respuestas y requiere un contenido completo a la vez, así que agrego esta respuesta:

Si está utilizando AutoLayout, al configurar esto solo debería funcionar para usted:

  • En codigo:

tableView.alwaysBounceVertical = false

  • o en Interface Builder:

Simplemente encuentre esta opción y la opción untick" Bounce Vertically".

Aquí está la referencia:

ingrese la descripción de la imagen aquí

Si no está utilizando AutoLayout:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }
Hemang
fuente
13

prueba esto

[yourTableView setBounces:NO];
codercat
fuente
@kyle: ¡gracias por la nota! - Pero mira, eso es lo que sucede automáticamente. Si es más corto que la pantalla (u otro soporte), NO se desplaza (y obviamente no rebotará, porque ni siquiera se desplazará). Si es más largo que la pantalla, se desplazará (y de hecho rebotará). ¿¿No??
Fattie
Tal vez he estado usando demasiado las vistas de colección ... tal vez funciona como lo describo para las vistas de colección, pero no para UITableView.
Fattie
9

Puede configurar habilitar / deshabilitar el rebote o desplazarse por la vista de tabla seleccionando / deseleccionando estos en el área Vista de desplazamiento

Área de edición de vista de desplazamiento

Akila Wasala
fuente
3

Puede editar esto en su guión gráfico (si está utilizando uno). Debajo de la vista de tabla hay una casilla de verificación que dice "Desplazamiento habilitado". Desmarque y ya está.

ericmarkmartin
fuente
3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;

rjobidon
fuente
3
Creo que me iluminé después de leer tu solución. Muchas gracias
Arash
Usé esto en mi punto de vistaDidAppear
Maria
1
Quise decir viewDidLayoutSubviews not viewDidAppear
Maria
0

La altura predeterminada es 44.0f para una celda de vista de tabla, creo. ¿Debe tener su fuente de datos a mano en una matriz? Luego solo verifique si [array count]*44.0fva más allá de los límites del marco y, si es así tableview.scrollEnabled = NO, configúrelo en SÍ. Hágalo donde calcule la fuente de datos para esa vista de tabla en particular.

Bourne
fuente
Las celdas de mi tabla son de diferentes tamaños (y pueden cambiar de tamaño en cualquier momento; estoy usando el método heightForRowAtIndexPath), por lo que probablemente no quiera codificar 44.0f. Creo que ese número es el mismo que tableView.rowHeight de todos modos?
Ginny
Entonces estaría haciendo su cálculo de altura total en ese método. Simple derecho? Si eso excede el límite de la pantalla, habilite el desplazamiento, de lo contrario déjelo deshabilitado. Se llamaría al método para todas las celdas visibles. Si no tiene suficientes datos para superar la pantalla, puede calcular la altura total directamente en ese método. Siga agregando a una variable global la altura que devuelve en cada llamada y tendrá su altura total.
Bourne
La respuesta de Roberto es una manera más fácil de lograr todo esto y dejar el cálculo a la vista de la tabla.
Bourne