¿Por qué hay relleno adicional en la parte superior de mi UITableView con estilo UITableViewStyleGrouped en iOS7?

637

A partir de iOS7, hay un espacio adicional en la parte superior de mi UITableViewque tiene un estilo UITableViewStyleGrouped.

Aquí hay un ejemplo:

ingrese la descripción de la imagen aquí

La vista de tabla comienza en la primera flecha, hay 35 píxeles de relleno inexplicable, luego el encabezado verde es UIViewdevuelto por viewForHeaderInSection(donde la sección es 0).

¿Alguien puede explicar de dónde proviene esta cantidad de 35 píxeles y cómo puedo deshacerme de ella sin cambiar a UITableViewStylePlain?


Nota:

En iOS 11 y posterior:

tableView.contentInsetAdjustmentBehavior = .never
esilver
fuente
¿Estás utilizando el último iOS 7? Algunos de estos TIPOS de inconsistencias (pero no todos, y tal vez no este) se han curado durante las previsualizaciones de desarrollo posteriores. Debería saberlo: postergué tanto que algunos de los problemas desaparecieron.
Dan Rosenstark
Compruebe la respuesta aquí - stackoverflow.com/a/18986158/1463604
Nishant
La respuesta corta es que este relleno adicional probablemente se deba al encabezado de la vista de tabla (no al encabezado de sección), y que UITableViewno le gusta que se le asigne un encabezado con una altura de 0.0. Visite stackoverflow.com/a/31223403/1394534 para obtener más detalles.
Aurelien Porte
30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];nota: 0.0fsolo se ignora si lo usa a la altura del rectángulo. Entonces usamos el CGFloat más cercano a cero posible (al menos esto "funcionó" para mí ... simplemente no es la solución ideal).
Alejandro Iván
1
@ AlejandroIván tu comentario acaba de hacerme la noche. Tengo una tableView con prototipos agrupados. Estoy usando numberSections = data.count y estableciendo numberRows = 1. Configuré heightForFooterInSection para hacer un espacio limpio entre cada uno y, por alguna razón, apareció una tableHeaderView en blanco.
Ryan Alexander

Respuestas:

863

Me ayudó lo siguiente:

YouStoryboard.storyboard> YouViewController> Inspector de atributos> Desmarcar: ajustar las inserciones de la vista de desplazamiento.

ingrese la descripción de la imagen aquí

Alejandro
fuente
42
Creo que esta es la forma correcta de eliminar ese relleno, en lugar de alterar los valores de edgeInset.
Hgeg
21
Esto no funcionó para mí: tengo una barra de navegación opaca arriba y esta desactivada empuja el contenido debajo de ella.
slycrel
55
No funciona cuando se usa personalizado collectionview. (Cuando la vista de tabla está adentro collectionviewcell)
Akshit Zaveri
55
No funcionó para mí; Lo único que funcionó fue cambiar a Plain en lugar de Agrupado
calce el
28
Tuve este problema con un TableViewController dentro de una vista de contenedor. Tuve que establecer esta propiedad no directamente en el TableViewController que estaba incrustado, sino en el controlador de vista que contenía la vista del contenedor. Entonces funcionó.
Andy Mortimer
326

Jugué un poco más con él y parece que este es un efecto secundario de la configuración de tableView tableHeaderView = nil.

Debido a que mi tableView tiene una apariencia dinámica tableHeaderView, cuando necesito ocultar el tableHeaderView, en lugar de hacerlo self.tableView.tableHeaderView = nil;, hago:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Me gusta más esta solución que establecer una configuración algo arbitraria contentInset.topporque también la uso contentInset.topdinámicamente. Tener que recordar eliminar 35px adicionales cada vez que recalculo contentInset.topes tedioso.

Señor t
fuente
44
Gran solución! De hecho, debe configurarlo en 0.01f para deshacerse de la vista de encabezado de vista de tabla predeterminada como en su código.
Simone Manganelli
2
Por cierto, esto también es posible hacer con un arrastrar y soltar en el generador de interfaces. ¡Gracias de todos modos! :)
Rudolf Adamkovič
8
usted señor merece una medalla para este
Vaibhav Gautam
77
Tenga en cuenta que una vista de altura de 0.01f en la parte superior de la vista de la tabla significará que todas las celdas debajo están desalineadas (la primera celda tiene un origen Y de 0.01, la siguiente de cell_height + 0.01, etc.) por lo que el contenido de esas celdas será desalineado (Encienda Debug > Color Misaligned Imagesel simulador para ver esto por sí mismo). No desea hacer eso.
Simon Whitaker
2
Es mejor usar en UITableViewHeaderFooterViewlugar de UIView. Y CGFLOAT_MINfunciona igual 0.01fpero mejor en teoría.
Jaybo
178

Para iOS 7, si está asignando una vista de tabla en un controlador de vista, puede examinar

self.edgesForExtendedLayout = UIRectEdgeNone;

tu problema parecía similar al mío

Actualizar:

Swift en iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
yeahdixon
fuente
3
Trabajó en mi llanura UITableView. El problema se debe al hecho de que UITableViewestaba UIViewControllerdentro de un elemento UINavigationControllerque causó que el contenido de la tabla cayera 44 puntos, por lo que el contenido inicial no estaba detrás del navBar. Sin embargo, eso no era necesario con mi diseño, por lo que solo causó problemas. Eventualmente cambié mi código al automaticallyAdjustsScrollViewInsetscual funcionó también.
DBD
Esta propiedad solo se aplica a los controladores de vista que están incrustados en un contenedor como UINavigationController. El controlador de vista raíz de la ventana no reacciona a esta propiedad. El valor predeterminado de esta propiedad es todo. .. Siento que el valor predeterminado debería ser 0? ¿Dónde tiene esto una ventaja?
Desh_
55
Más elegante con Swift 3:edgesForExtendedLayout = []
Dave Batton
Hola @yeahdixon ¿Qué software utilizas para hacer la flecha rosa? gracias de antemano
iArezki
175

Intente cambiar la contentInsetpropiedad que UITableViewhereda de UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

Es una solución, pero funciona.

nvrtd primero
fuente
66
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);funcionó mejor para mí porque había 20 píxeles adicionales en la parte superior e inferior.
Brian
1
Aunque esta solución de "fuerza bruta" funciona, creo que las de abajo (específicamente las inserciones de ajuste automático) deberían tener una clasificación más alta.
eladleb
134
self.automaticallyAdjustsScrollViewInsets = NO;

intenta, puedes lidiar con eso!

guanhuiwit
fuente
Esto funciona muy bien para ocultar tableHeaderView en iOS 7.0, pero no es compatible con versiones anteriores.
Brian
Funciona muy bien con iOS 7.
StackRunner
3
Importante: asegúrese de hacer esto en el controlador de vista de contenedor, si su UITableView se coloca en un controlador que luego se incrusta en otro controlador, haga esto en el controlador superior de incrustación, no directamente en el que coloca el UITableView (donde AutoLayout cuidar las cosas).
James Stone
Esto es mejor que uncheck Adjust scroll view insets. Porque a veces no usamos storyboard para construir nuestra interfaz de usuario.
JW.ZG
Esto funciona para mi. Adjunté la vista a la barra de navegación y la vista de tabla, no sucedió en iOS 11, pero ocurre en iOS 10. Gracias.
dobiho
78

Podría detectar si su aplicación ejecuta iOS7 o superior y agregar estos dos métodos en su delegado de vista de tabla (generalmente en su código UIViewController)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Quizás esta no sea una solución elegante, pero funciona para mí.

Versión rápida:

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

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
Hombre ligero
fuente
1
Esto funcionó para mí. UITableView agrega espacio en la parte superior por muchas razones diferentes. Específicamente, relacionado con OP, el problema solo ocurre para la vista de tabla de estilos agrupados. Y esta solución solucionó el problema.
RajV
55
Puede usar CGFLOAT_MIN en lugar de 0.001, le da el valor absoluto más pequeño de CGFloat.
eiKatte
2
Esta es la respuesta correcta, ya que la característica real es que el relleno solo está allí en la vista de tabla de estilos agrupados y se ignora si especifica el encabezado / pie de página
Jakub Truhlář
Esto debe marcarse como la respuesta correcta. Un método delegado para anular y responde la pregunta. Al menos intente esto primero si lee hasta aquí todos los trucos. Intente twittear: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) section {// return CGFLOAT_MIN; devuelve 30.0f; }
Matthew Ferguson el
¡Agradable! Como beneficio adicional, si desea un pequeño encabezado en la parte superior y más entre las secciones agrupadas, puede usar lo siguiente:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders
55

He encontrado la causa de mi error original y he creado un proyecto de muestra que lo muestra. Creo que hay un error de iOS7.

A partir de iOS7, si crea un UITableView con el estilo Agrupado, pero no tiene un delegado configurado en el primer diseño, entonces configura un delegado y llama a reloadData, habrá un espacio de 35 px en la parte superior que nunca desaparecerá.

Vea este proyecto que hice mostrando el error: https://github.com/esilverberg/TableViewDelayedDelegateBug

Específicamente este archivo: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

Si la línea 24 está activa,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

Habrá un espacio extra de 35 px en la parte superior. Si la línea 27 está activa y 24 está comentada,

self.tableView.delegate = self;

No hay espacio en la parte superior. Es como si tableView almacenara en caché un resultado en alguna parte y no se volviera a dibujar después de configurar el delegado y llamar a reloadData.

esilver
fuente
21
Agregaría que incluso si hay un delegado pero el delegado tableView:heightForHeaderInSection:y tableView:heightForFooterInSection:devuelve 0 también tendrá este problema. Implementar los métodos de protocolo anteriores Y devolver 0.01f lo arregló para mí.
John Estropia
1
¡¡SI!! He probado 3 llamadas soluciones, ¡y esta fue la única! Brillante, gracias: D
Henrik Erlandsson
Perfecto. Cualquiera informó un error porque creo que este no es el comportamiento previsto.
Pushparaj
gran descubrimiento! Esto todavía está sucediendo en ios 9 (no estamos usando XIB) pero al configurar el delegado en init se corrigió el espaciado (no en loadView o viewDIdLoad). ¡Gracias!
John Stricker
1
Configuración estimatedHeight de cabecera me ayudó
Viktor
49

Desmarque "Ajustar inserciones de vista de desplazamiento"

ingrese la descripción de la imagen aquí

Tú Đt
fuente
Necesitaba esta opción para otro controlador de vista mío, y aparentemente cuando hice un nuevo VC, el cambio continuó. ¡Gracias por esto!
David
¡Si! Funciona, solo configúralo en ContainerView y funciona.
Felipe FMMobile
46

Otro comentario rápido ... incluso en XCode 6.1, hay un error con espacios verticales que aparecen en la parte superior de UIScrollViews, UITextViewsy UITableViews.

ingrese la descripción de la imagen aquí

A veces, la única forma de solucionar este problema es ir al Guión gráfico y arrastrar el control del problema para que ya no sea la primera subvista en la página.

ingrese la descripción de la imagen aquí

(Mi agradecimiento a Oded por señalarme en esta dirección ... Estoy publicando este comentario, solo para agregar algunas capturas de pantalla, para demostrar los síntomas y corregirlo).

Mike Gledhill
fuente
1
Tenga en cuenta que este error, errrr, también ocurre en iOS 8 si tiene un UITextView como primer subcontrol en su página ... por lo que no es solo un problema de UITableView.
Mike Gledhill
1
De todas las soluciones, solo este truco funcionó para mí. Una solución extraña a un error extraño. He enfrentado este problema con UITableview.
Mesbah
44
¡1 millón de gracias! Esta es la única solución que funcionó para mí.
user139816
1
(Estoy sorprendido de que hayan pasado 18 meses, y los lectores todavía están votando esta respuesta. ¿Apple aún no ha solucionado este problema?)
Mike Gledhill
1
¡salvó mi vida! Gracias. ¿sabes cuánto tiempo llevó encontrar esta pequeña "solución" simple? grrh
Mc.Stever
40

De acuerdo con esta guía de transición para iOS7 de Apple, las inserciones de contenido de la vista de desplazamiento se ajustan automáticamente. El valor predeterminado de automaticAdjustsScrollViewInsets se establece en YES.

El UIViewController que tiene UITableView debe establecer esta propiedad en NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Esto hará el truco.

EDITAR 1:

Además, uno podría intentarlo:

self.navigationController.navigationBar.translucent = YES;

Esto también elimina el relleno adicional en la parte superior.

girish_vr
fuente
Muy buena respuesta, a menos que no responda exactamente la pregunta. Esilver habla de una brecha de 35 píxeles, pero iOS7 agrega un encabezado adicional de 20 píxeles: igual a la altura de la barra de estado.
Martin
Problema ridículo. Gracias por la respuesta.
Genki
Esta es la respuesta a un problema diferente.
entonio
Gracias, funcionó para mí, en mi caso particular, tenía un controlador de vista de tabla incrustado en el controlador de vista, y al configurar automáticamenteAdjustsScrollViewInsets = false en el controlador de vista, el espacio superior desapareció
Alexey
39

Mientras usa TableView agrupado, use esto para evitar el corte de bordes a la vista

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Aqib Mumtaz
fuente
Intenté todos los demás. Este es el que funcionó! Thx
Michael
36

Muchas de las respuestas anteriores anteriores son demasiado extravagantes. Se romperían en cualquier momento en el futuro si Apple decide arreglar este comportamiento inesperado.

Raíz del problema:

  1. a UITableViewno le gusta tener un encabezado con una altura de 0.0. Si lo que intenta hacer es tener un encabezado con una altura de 0, puede saltar a la solución.

  2. incluso si luego asigna una altura no 0.0 a su encabezado, a a UITableViewno le gusta que se le asigne un encabezado con una altura de 0.0 al principio.

Solución:

Entonces, la solución más simple y confiable es asegurarse de que la altura del encabezado no sea 0 cuando la asigne a la vista de la tabla.

Algo como esto funcionaría:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

Algo como esto llevaría al problema en algún momento (generalmente, después de un desplazamiento):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Aurelien Porte
fuente
Finalmente, encontré la respuesta que funciona. Gracias. Además, aprendí que en tableView.tableHeaderViewrealidad es una vista accesoria sobre el contenido de la fila. Estaba confundido con los encabezados de sección hasta que salió su respuesta.
Joe Huang
1
CGFLOAT_MINha sido reemplazado por CGFloat.leastNormalMagnitudeSwift 3
Clay Ellis
29

Storyboard:

Simplemente desmarque: Adjust Scroll View Insetsen las opciones de View Controller

ingrese la descripción de la imagen aquí

Código:

self.automaticallyAdjustsScrollViewInsets = false
Bartłomiej Semańczyk
fuente
2
usando xcode 7 No veo el inspector de atributos> Diseño, donde debo agregar self.automaticallyAdjustsScrollViewInsets = false
alex
a la vista se cargó.
CW0007007
23

Esta es la solución para iOS 10 con Swift 3:

Puede deshacerse de los rellenos superiores e inferiores implementando los siguientes métodos desde UITableViewDelegate.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
AndreasLukas
fuente
La segunda página en SO me ayudó ... No sé por qué, tal vez debido a AutomaticDimension, tal vez debido a las Restricciones con el VFL, de todos modos, ¡gracias! ozi bua ist brav! : D
Pentarex
Estos son los encabezados y pies de página de la sección . La pregunta se refiere a todo el encabezado de la tabla. Además, no hay nada específico para Swift3 o iOS 10 en ninguno de los métodos de delegado (han existido desde siempre).
Nicolas Miari
14

En mi caso esto fue lo que me ayudó. Estoy apoyando iOS6 también.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Lukas
fuente
No estoy seguro de lo que hace, pero funcionó perfectamente. ¿Podrías dar alguna explicación?
Matt Wolfe
@MattWolfe Estaba perdido y encontré esta solución, pero tampoco estoy seguro de por qué sucede esto. Supongo que el controlador está decidiendo que la vista de tabla necesita un recuadro, debido a la barra de estado (o en otros casos barra de herramientas / barra de pestañas), por lo que la agrega automáticamente. Realmente estoy luchando con algunas de las nuevas "características" de iOS7. ¿Quizás alguien lo entiende y tiene una explicación real sobre esto?
Lukas
Pasé los últimos 2 días portando una aplicación relativamente pequeña para iOS 7 y aún teniendo problemas menores ... Lo solucioné en ios 7, se rompe en 6 y viceversa ... ¡Me estoy volviendo loco!
Matt Wolfe
Este es un problema diferente al OP. Incluso con esto, para la vista de tabla agrupada, se agrega un espacio adicional en la parte superior.
RajV
1
esta parece ser la línea clave: self.automaticallyAdjustsScrollViewInsets = NO; solo configurando eso eliminó el espacio extra que tenía.
Mike M
14

Simplemente agregue lo siguiente a su viewDidLoad en su VC:

self.automaticallyAdjustsScrollViewInsets = NO;
judepereira
fuente
Esta solución funcionó y prefiero configurar manualmente las inserciones con números mágicos. ¡Gracias!
inmovilizador
14

Así que estaba probando todos los métodos aquí, y esta vez ninguno de ellos ayudó. Mi caso era una vista de tabla agrupada en iOS 9. Realmente no sé por qué y cómo descubrí esta, pero para mí, funcionó tableViewHeadercon una UIViewcon al menos 0.01altura. CGRectZerono ayudó, nada realmente ayudó:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
sunshinejr
fuente
10

Swift: iOS Tenía vista de tabla en vista de desplazamiento ... cuando hacía clic en "Atrás" en la misma pantalla. La vista de desplazamiento ocupa más espacio en la parte superior ... para resolver esto, he usado:

 self.automaticallyAdjustsScrollViewInsets = false

Un valor booleano que indica si el controlador de vista debe ajustar automáticamente sus inserciones de vista de desplazamiento. El valor predeterminado es verdadero, lo que permite que el controlador de vista ajuste sus inserciones de vista de desplazamiento en respuesta a las áreas de pantalla consumidas por la barra de estado, la barra de navegación y la barra de herramientas o barra de pestañas. Establézcalo en falso si desea administrar los ajustes de inserción de la vista de desplazamiento usted mismo, como cuando hay más de una vista de desplazamiento en la jerarquía de vistas.

Vinod Joshi
fuente
10

Gracias a la respuesta de @Aurelien Porte. Aqui esta mi solucion

Causa de este problema: -

  1. A UITableView no le gusta tener un encabezado con una altura de 0.0. Si lo que intenta hacer es tener un encabezado con una altura de 0, puede saltar a la solución.
  2. incluso si luego asigna una altura no 0.0 a su encabezado, a UITableView no le gusta que se le asigne un encabezado con una altura de 0.0 al principio.

En ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

No hay necesidad de algo como esto: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

En heightForHeaderInSectiondelegado: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

En viewForHeaderInSectiondelegado: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}
Ashish Pisey
fuente
10

Así es como se puede solucionar fácilmente en iOS 11 y Xcode 9.1 través de Storyboard:

Seleccione Vista de tabla> Inspector de tamaño> Inserciones de contenido: nunca

Saeed Ir
fuente
1
Trabajó para mí :)
bhupinder
¡Excelente! Gracias :)
Saeed Ir
1
Esto es en lugar de automaticallyAdjustsScrollViewInsetsen iOS 11
Nik Kov
9

Supongo que eso es solo parte del nuevo UITableViewStyleGroupedestilo. Está en todas las vistas de tabla agrupadas y no parece haber ninguna forma directa de controlar ese espacio.

Si ese espacio está siendo representado por un UIView , sería posible buscar a través de todos subviewslosUITableView para encontrar esa vista específica y editarla directamente. Sin embargo, también existe la posibilidad de que ese espacio sea solo un desplazamiento codificado antes de que comiencen los encabezados y las celdas y no habrá ninguna forma de editarlo.

Para buscar en todas las subvistas (ejecutaría este código cuando la tabla no tiene celdas, para que sea un poco más fácil leer la salida):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}
Kevin
fuente
3
Si UITableViews (para ser más específicos UITableViewCellScrollView) en iOS7 nos ha enseñado una cosa, es dejar solo la jerarquía de vista de las clases integradas.
Matthias Bauch
Buen punto. La otra opción es ... seguir pirateando para cada iOS;)
Dan Rosenstark
Vaya, si. Pretendía escribir esa advertencia pero olvidé.
Kevin
Kevin - Creo que tienes razón, esto es por diseño. Parece que devolver 0 para heightForHeaderInSection es la forma más fácil de eliminar este relleno. Por alguna razón en esa instancia en particular, no estaba funcionando para mí, pero funciona en otros UITableViews.
esilver
1
Definitivamente es "por diseño". Si detuvo la ejecución y ejecutó: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]verá que el encabezado de la tabla, o el encabezado de la primera sección, o la primera celda (dependiendo de lo que use) naturalmente deja un borde de 35 px ... boo.
Sr. T
9

Mi respuesta será una respuesta más general, pero también se puede aplicar a esto.

Si la vista raíz (del ViewController ) o el primer hijo (subvista) de la vista raíz es una subclase de UIScrollView (o UIScrollView), y si

self.navigationController.navigationBar.translucent = YES;

Framework establecerá automáticamente el contenido precalculado .


Para evitar esto puedes hacer

self.automaticallyAdjustsScrollViewInsets = NO;

pero en mi caso no pude hacer esto, porque estaba implementando SDK que tiene el componente UIView que pueden usar otros desarrolladores. Ese componente UIView contiene UIWebView (que tiene UIScrollView como la primera subvista). Si ese componente se agrega como el primer elemento secundario en la jerarquía de vistas de UIViewController, el sistema aplicará inserciones automáticas.

He solucionado esto agregando una vista ficticia con marco (0,0,0,0) antes de agregar UIWebView.

En este caso, el sistema no encontró la subclase de UIScrollView como la primera subvista y no aplicó inserciones

zvjerka24
fuente
¡salvavidas! graciasself.automaticallyAdjustsScrollViewInsets = false
ethanneff
8

Este código funcionó para mí, la mejor respuesta para mí que estaba escrita en la parte objective-Csuperior, así que la convertí en Swift.

Para Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Simplemente escriba esto viewDidLoad()y funcionará como un encanto.

Vipul Kumar
fuente
1
Muchas gracias, funcionó bien para mí.
Ángel Polotto
1
de nada feliz codificación
Vipul Kumar
7

Tuve la misma solución que Arielyz. Una vez que moví el UITableView para que no fuera la primera subvista de la vista principal, desapareció. Mi espacio era de 20 px, no de 35.

No pude recrearlo en un retrato xib, solo un paisaje xib. Archivaré un error de radar más tarde si puedo reproducirlo en una aplicación de demostración simple.

Oded
fuente
Me encontré con el mismo problema, no pude resolverlo cambiando el ContentInset, pero este método funcionó, aunque es bastante hacky. Por lo que vale, usando la herramienta de depuración visual, pude ver que mientras el UITableView tenía la altura correcta, el UITableViewWrapper dentro no.
Mic Fok
Perfecto. Esto solucionó el error para mí, en XCode 6.1. Ninguna de las otras sugerencias en esta página de StackOverflow hizo ninguna diferencia. Tenía un UITableView dentro de una UIView, y fue la primera subvista. Arrastrándolo para convertirse en la segunda subvista lo arregló perfectamente. (Si alguien me necesita, estaré en el pub.)
Mike Gledhill
¡Gracias! Esto también funciona si tiene un controlador de vista de tabla dentro de un contenedor. Mover el contenedor para que no sea el primero en la vista principal elimina el espacio en la parte superior de la vista de tabla.
strangeluck
7

Creo que hacer UIEdgeInsets -35 0 0 0 es tedioso. En mi caso, implementé tableView: heightForHeaderInSection: método y tiene el potencial de devolver 0.

Cuando cambié 0 a 0.1f, el problema simplemente desapareció.

Jiangfan Du
fuente
1
Si pudiera, votaría esto más de una vez. Debe ser un error extraño de autolayout o algo así. Como cualquier cosa> 0 funciona, sugiero que en lugar de 0.1 use FLT_EPSILON o DBL_EPSILON, ya que ambos representan el valor positivo más pequeño de modo que 1.0 + epsilon! = 1.0
Henri Normak
7

Lo único que funcionó para mí fue:

Rápido :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Objetivo-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

Además, todavía tenía un espacio extra para la primera sección. Eso fue porque estaba usando la tableHeaderViewpropiedad incorrectamente. También se solucionó agregando:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Danut Pralea
fuente
Funciona para mí para Swift 4.2. Gracias
Sylar
Intenté todo en esta página, para iOS13 vista de tabla agrupada con vista de encabezado. self.tableView.tableHeaderView = UIView (frame: CGRect (x: 0, y: 0, width: tableView.frame.size.width, height: 0.01)). solucionó el problema.
Ning
7

Código Swift 4: para la vista de tabla sin encabezados de sección, puede agregar este código:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

y obtendrá el espacio del encabezado a 0.

Si desea un encabezado de su altura específica, pase ese valor:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

y la vista del delegado viewForHeaderinSection.

keerthana manoharan
fuente
Esto no responde la pregunta. La pregunta era de dónde viene el espacio extra, no cómo deshacerse de él.
Stephen Newell
Lo extraño es que si devuelve 0 en heightForHeaderInsection aún obtendrá este espacio extra. Funciona perfecto con CGFloat.leastNormalMagnitude (número menos positivo)
ShadeToD
7

Para ser específicos, para eliminar el espacio tableviewHeader desde arriba hice estos cambios:

YouStoryboard.storyboard> YouViewController> Seleccione TableView> Inspector de tamaño> Inserciones de contenido: configúrelo como nunca.

ingrese la descripción de la imagen aquí

usuario832
fuente
¿Cuál es la información adicional que no sea la captura de pantalla en comparación con esta respuesta ?
Artjom B.
es lo mismo, supongo, no encontré esa respuesta cuando estaba buscando una solución. ¿Debo eliminar mi respuesta entonces ...?
user832
No, si puede ampliar un poco su respuesta describiendo por qué las inserciones de contenido = Nunca resuelve este problema (¿cómo funciona esta opción?).
Artjom B.
Cuando las inserciones de contenido se establecen en nunca, el TableView no se desplazará hacia arriba en la edición de textField.
mojtaba al moussawi
6

use este creo que esta ayuda ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
Shahzaib Maqbool
fuente
1
¡Brillante! Funciona como un encanto en iOS 9.2. Esta respuesta es perfecta ya que en algunos casos necesito suprimir el primer encabezado mientras que en otros lo muestro. Vi otra respuesta usando CGFloat.min, que también funciona. Entonces mi viewController ahora puede proporcionar un número real como 44.0 o esencialmente 0.
David H
6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
AG
fuente
automaticAdjustsScrollViewInsets = ¡falso trabajo mío! ¡Gracias!
Daniel Kuta