Eliminar el espacio vacío antes de las celdas en UITableView


172

Actualmente estoy tratando de poner un UITableViewen una ubicación diferente en lugar de en la parte superior de mi controlador de vista. Dicho esto, está tratando de agregar el encabezado en la parte superior para tener en cuenta la barra de navegación, pero esto no es necesario ya que no tengo en la parte superior de mi controlador.

Si pongo la esquina superior izquierda del lugar UITableViewdonde quiero que estén las celdas, no las coloca allí:

Ahora, si solo muevo la vista de la tabla hacia arriba para que las celdas estén en el lugar correcto, aparece un problema diferente: las celdas se pueden mover hacia allí al desplazarse (esto es con mi dedo sobre el controlador de navegación):

Cuando lo dejo ir, sí, las celdas irán justo debajo de la barra de búsqueda, pero obviamente es un problema cómo puedes colocarlas encima.

¿Cómo haría para hacer esto? ¿Hay alguna manera más fácil?

Respuestas:


378

¿Aparecen las celdas del UITableViewprograma en el espacio vacío cuando te desplazas hacia abajo?

Si es así, entonces el problema podría ser la inserción que se agrega al UITableViewcontrolador de navegación que tiene en su vista. El recuadro se agrega a la vista de tabla para que el contenido se coloque debajo de la barra de navegación cuando no se ha producido ningún desplazamiento. Cuando se desplaza la tabla, el contenido se desplaza y se muestra debajo de una barra de navegación transparente. Por supuesto, este comportamiento solo se desea si la vista de tabla comienza directamente debajo de la barra de navegación, que no es el caso aquí.

Otra cosa a tener en cuenta es que iOS ajusta el contenido de contenido solo para la primera vista en la jerarquía de vistas si es UIScrollViewo es descendiente (por ejemplo, UITableViewy UICollectionView). Si su jerarquía de vistas incluye múltiples vistas de desplazamiento, automaticallyAdjustsScrollViewInsetsrealizará ajustes solo en la primera.

Aquí se explica cómo cambiar este comportamiento:

a) Generador de interfaz

  • Seleccione el controlador de vista
  • Inspector de atributos abiertos
  • Hay una propiedad llamada "Ajustar inserciones de vista de desplazamiento" en el inspector de atributos de IB (cuando se selecciona un controlador de vista) que está activada de forma predeterminada. Desmarca esta opción:


    (Imagen cortesía de Dheeraj D )

No estoy seguro de qué versión de Xcode introdujo esta opción (no la detectó en las notas de la versión), pero al menos está disponible en la versión 5.1.1.

Editar: para evitar confusiones, esta fue la tercera opción mencionada en los comentarios

b) programáticamente

Agregue esto a ie viewDidLoad(créditos a la respuesta de Slavco Petkovski y al comentario de Cris R )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Esto podría ser relevante para los niños de edad escolar

Puedes arreglar esto agregando

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

O si está utilizando IB y si la barra de navegación no es transparente (no se puede ver en la captura de pantalla)

  • Seleccione el controlador de vista
  • Inspector de atributos abiertos
  • En la sección Ver opciones del controlador Extender bordes, anule la selección de "Bajo las barras superiores"

2
Deseleccionar "Under Top Bars" en el UIView funcionó bien para mí. Gracias.
Andreas Øverland

Me estaba volviendo loco usando "Paginación habilitada" y el desplazamiento solo cambiaba por la altura de la barra de navegación en lugar de la celda completa. Gracias.
LordParsley

8
La tercera opción: anule la selección de "Ajustar inserciones de vista de desplazamiento" - funcionó como un encanto. gracias lekksi!
Stas Zhukovskiy

2
self.automaticallyAdjustsScrollViewInsets = false en Swift trabajando "de pelos"!
Cris R

1
Gracias configurar UIEdgeInsetsZero es necesario si se reutiliza una tabla en un nuevo controlador de tabla cada vez que se muestra; de lo contrario, aparece el mismo espacio en blanco y se hace más y más grande.
malhal

71

Tuve este mismo problema y estoy bastante seguro de que tuve una UIView allí en un momento. Simplemente copiando toda la vista de tabla, eliminándola y pegándola nuevamente, me lo arregló.


77
Esto es realmente muy extraño. Esto resolvió el problema. ¿Alguna idea de cuándo sucede esto?
MiQUEL

Creo que puedes resolverlo mucho más fácilmente siguiendo mi respuesta del
10/13

Tuve el mismo problema. Quitarlo y leerlo también funcionó para mí.
sma

3
Hasta donde sé, las inserciones de contenido de la vista de desplazamiento se ajustan automáticamente (si automáticamenteAdjustsScrollViewInsets = YES, que es el valor predeterminado) solo si la vista de desplazamiento es el primer elemento secundario en la jerarquía de vista del controlador de vista. Supongo que esta solución funciona porque después de copiar y pegar la vista de tabla ya no es la primera vista en la jerarquía de vistas.
lekksi

Lo que sucede es que cuando tableView es lo primero que agrega a la vista, el sistema piensa que tiene que dejar espacio para la navegación. Supongo que aquí algunas personas agregan tableView y luego headerView. Después de algunos problemas, luego eliminan el tableView y lo agregan nuevamente, lo que sucede es que el headerView es lo primero en la jerarquía, por lo que el sistema ya no tiene que adaptarse, el problema está resuelto. Lo sé porque solo uso código, por lo que en mi caso tuve que agregar primero el encabezado y luego la tabla para arreglarlo.
Lluis Gerard

40

Seleccione la vista de tabla en su guión gráfico y asegúrese de que el estilo esté configurado en "Normal", en lugar de "Agrupado". Puede encontrar esta configuración en la pestaña Inspector de atributos.


increíble ... esta fue la solución para mí extrañamente ... Acabo de copiar y pegar todo el controlador de vista, pero de alguna manera este tableView del controlador de vista pegado tenía ese extraño desplazamiento. Esta respuesta resolvió mi problema
daisura99

Esto resolvió el problema, pero ahora las secciones de encabezado se comportan de manera diferente. ¿Nadie?
Bruno Muniz

Salud. Donde quiera que estés en este mundo. Te bendigo por siempre.
gabuchan

9

En mi caso, tenía un UILabel bajo la jerarquía UITableView en vista.

Lo moví "hacia adelante" y apareció el espacio en blanco. No estoy seguro de por qué, pero funciona así, si hay algo debajo de tableView, oculta el espacio en blanco.

También puede intentar marcar / desmarcar "Ajustar recuadros de vista de desplazamiento" en el inspector del controlador de vista en el guión gráfico.

ingrese la descripción de la imagen aquí


2
Tengo un UITableView agrupado y la desactivación de "Ajustar inserciones de vista de desplazamiento" funcionó.
Matt

5

NINGUNO de los anteriores me ayudó. pero hacer esto ayudó :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

en lugar de '-64' puede poner cualquier otro número dependiendo de la altura de su barra de navegación.


4

Puede haber pre-agregado UIRefreshControl. Tengo este problema con un código como este:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Como ves, me puse self.refreshControllerinmediatamente despuésinit

Pero, si configura refreshControldespués de la configuración, entonces el espacio superior no lo interfiere.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

No puedo creer que este fuera el problema real. Es solo un problema para mí en <= 9.3.5. ¿Cómo diablos resolviste esto?
Sirenas

4

Si está haciendo esto en iOS 11, AutomaticAdjustsScrollViewInsets no funcionará porque está en desuso, el siguiente código funcionó para mí según la respuesta en esta publicación: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

Espero que esto ayude.


4

En el Guión gráfico, configure el contentInsetsde su tableviewen Nunca

ingrese la descripción de la imagen aquí


3

No puedo decirlo con certeza, pero parece que tienes una UIView extra atrapada entre donde comienzan las celdas prototipo y la parte superior de UITableView. Mi imagen se ve exactamente como la suya si elimina el texto / líneas que agregué.

ingrese la descripción de la imagen aquí


3

Todavía no estoy seguro de qué causó ese espacio adicional en la parte superior, pero descubrí que eliminar UITableView con el espacio y reemplazarlo por uno nuevo eliminaba el espacio.

Debo haber arrastrado una UIView allí accidentalmente, pero no pude seleccionarla, así que no pude eliminarla.


3

Swift 5

Prueba con remove tableHeaderView y tableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

Verifique su marco de vista de tabla en storyboard o xib. El mío por defecto tiene un valor de posición ay, de ahí el error


2

En mi aplicación también he experimentado un problema como este. He configurado el recuadro del borde superior de tableView zero. También intentado establecer falseparaautomaticallyAdjustsScrollViewInsets . Pero no funcionó.

Finalmente obtuve una solución de trabajo. No sé, esta es la forma correcta. Pero implementar el heightForHeaderInSectionmétodo delegado funcionó para mí. Debe devolver un valor distinto de cero para que funcione (el retorno cero mostrará el mismo espacio que antes).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

En 2017, lo que funciona para mí es simplemente esta línea

navigationController? .navigationBar.isTranslucent = false

No tengo idea de por qué eso lo afectaría. Quizás alguien podría explicarlo. Pero estoy bastante seguro de que esta es la respuesta que la mayoría de la gente buscaría.


Eso también lo hizo por mí. ¡Gracias!
scurioni

2

En iOS 11 y superior, Apple ha cambiado la propiedad para ajustar el contenido. Uso contentInsetAdjustmentBehaviory ajuste .neverpara eliminar el espacio extra por encima UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

Espero que esto ayude.


1

Bueno, para mí el problema ocurrió cuando arrastré una celda prototipo del menú a la vista de tabla. Así que eliminé eso y solo configuré la celda prototipo en 1 en las propiedades del inspector de vista de tabla


1

Estoy haciendo esto mediante programación, y simplemente moví mi addSubview (tableView) al final después de agregar todas mis otras subvistas, ¡y resolvió mi problema!

No estoy seguro de por qué esto solo aparece en el dispositivo y no en mi simulador, ¡pero de cualquier manera al menos hay una solución simple!


1

Mientras UITableView no sea la primera subvista del controlador de vista, el espacio vacío no aparecerá.

Solución: Agregue un objeto de vista oculto / claro (vistas, etiquetas, botón, etc.) como la primera subvista del controlador de vista (al mismo nivel que UITableView pero antes).


Pasé mucho tiempo tratando de resolver esto, probando muchas de las sugerencias aquí y en otras publicaciones. Este es el que lo resolvió. ¡Gracias! ¿Puede explicar por qué o publicar un enlace a algún documento que lo haga? ¡Estoy aprendiendo el desarrollo de iOS y es muy diferente a Android! :)
Mark

0

UIView se puede insertar en la parte superior e inferior de la tabla (arrastrar y soltar). Establezca sus propiedades como transparentes y con una altura de 1 px. Esto es para eliminar el relleno adicional en frente de las celdas.


0

También tuve este problema, tableView no era la última vista en la jerarquía. En mi caso, tenía una vista superior (aunque no se superponían entre sí), así que la arrastré por encima de la tabla Vista en la jerarquía y eso fue todo.


0

Acabo de encontrar una solución para esto.

Simplemente seleccione tableview y haga clic en Editor -> Organizar -> Enviar al frente

Funcionó para mí y espero que los ayude a todos.


0

En mi caso, estaba usando ContainerViewController y ponía UITableViewController en él. Después de eliminar ContainerViewController. Los problemas desaparecen.


0

Error de Xcode 8 ...

Pruebe esto primero si su estilo de Storyboard UITableView está configurado en Normal.

Establezca el estilo de la tabla en Agrupado y luego nuevamente en Normal. Esto eliminó el espacio en mi aplicación en la cabeza de mi UITableView.


0

En mi caso, estaba usando una vista de contenedor. (Vista principal -> Vista de contenedor -> UITableView)

El espacio extra en la parte superior, creo, es como el espacio de la barra de notificaciones del dispositivo (donde se muestra el tiempo, la batería). Realmente lo hago, no es una suposición.

Lo que hice fue de UI Builder:

  • seleccione el controlador de vista de tabla completo
  • Inspector de atributos abiertos
  • Vaya a -> Ver controlador -> Diseño -> "Seleccionar quiere pantalla completa"

0

Puede usar este código en viewDidLoad o viewDidAppear donde se está creando su tabla:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

configure los bordes extendidos de ViewController en el guión gráfico para que la underTopBarpropiedad no esté marcada.


0

Estaba teniendo el mismo problema. Lo resolví agregando lo siguiente para viewDidLoad.

self.extendedLayoutIncludesOpaqueBars = true


-2

comprobar

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • mencione la función delegada de tableview cellForRowAtIndexPath:
  • puede manejar ios 6 y 7.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.