A partir de iOS7, hay un espacio adicional en la parte superior de mi UITableView
que tiene un estilo UITableViewStyleGrouped
.
Aquí hay un ejemplo:
La vista de tabla comienza en la primera flecha, hay 35 píxeles de relleno inexplicable, luego el encabezado verde es UIView
devuelto 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
ios
uitableview
ios7
esilver
fuente
fuente
UITableView
no 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.self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];
nota:0.0f
solo 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).Respuestas:
Me ayudó lo siguiente:
YouStoryboard.storyboard> YouViewController> Inspector de atributos> Desmarcar: ajustar las inserciones de la vista de desplazamiento.
fuente
collectionview
. (Cuando la vista de tabla está adentrocollectionviewcell
)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 eltableHeaderView
, en lugar de hacerloself.tableView.tableHeaderView = nil;
, hago:Me gusta más esta solución que establecer una configuración algo arbitraria
contentInset.top
porque también la usocontentInset.top
dinámicamente. Tener que recordar eliminar 35px adicionales cada vez que recalculocontentInset.top
es tedioso.fuente
Debug > Color Misaligned Images
el simulador para ver esto por sí mismo). No desea hacer eso.UITableViewHeaderFooterView
lugar de UIView. YCGFLOAT_MIN
funciona igual0.01f
pero mejor en teoría.Para iOS 7, si está asignando una vista de tabla en un controlador de vista, puede examinar
tu problema parecía similar al mío
Actualizar:
Swift en iOS 9.x:
Swift 3:
fuente
UITableView
. El problema se debe al hecho de queUITableView
estabaUIViewController
dentro de un elementoUINavigationController
que causó que el contenido de la tabla cayera 44 puntos, por lo que el contenido inicial no estaba detrás delnavBar
. Sin embargo, eso no era necesario con mi diseño, por lo que solo causó problemas. Eventualmente cambié mi código alautomaticallyAdjustsScrollViewInsets
cual funcionó también.edgesForExtendedLayout = []
Intente cambiar la
contentInset
propiedad queUITableView
hereda deUIScrollView
.Es una solución, pero funciona.
fuente
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);
funcionó mejor para mí porque había 20 píxeles adicionales en la parte superior e inferior.intenta, puedes lidiar con eso!
fuente
uncheck Adjust scroll view insets
. Porque a veces no usamos storyboard para construir nuestra interfaz de usuario.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)
Quizás esta no sea una solución elegante, pero funciona para mí.
Versión rápida:
fuente
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
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,
Habrá un espacio extra de 35 px en la parte superior. Si la línea 27 está activa y 24 está comentada,
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.
fuente
tableView:heightForHeaderInSection:
ytableView:heightForFooterInSection:
devuelve 0 también tendrá este problema. Implementar los métodos de protocolo anteriores Y devolver 0.01f lo arregló para mí.Desmarque "Ajustar inserciones de vista de desplazamiento"
fuente
Otro comentario rápido ... incluso en XCode 6.1, hay un error con espacios verticales que aparecen en la parte superior de
UIScrollViews
,UITextViews
yUITableViews
.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.
(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).
fuente
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.
Esto hará el truco.
EDITAR 1:
Además, uno podría intentarlo:
Esto también elimina el relleno adicional en la parte superior.
fuente
Mientras usa TableView agrupado, use esto para evitar el corte de bordes a la vista
fuente
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:
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.incluso si luego asigna una altura no 0.0 a su encabezado, a a
UITableView
no 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:
Algo como esto llevaría al problema en algún momento (generalmente, después de un desplazamiento):
fuente
tableView.tableHeaderView
realidad es una vista accesoria sobre el contenido de la fila. Estaba confundido con los encabezados de sección hasta que salió su respuesta.CGFLOAT_MIN
ha sido reemplazado porCGFloat.leastNormalMagnitude
Swift 3Storyboard:
Simplemente desmarque:
Adjust Scroll View Insets
en las opciones de View ControllerCódigo:
fuente
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
.fuente
En mi caso esto fue lo que me ayudó. Estoy apoyando iOS6 también.
fuente
Simplemente agregue lo siguiente a su viewDidLoad en su VC:
fuente
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ó
tableViewHeader
con unaUIView
con al menos0.01
altura.CGRectZero
no ayudó, nada realmente ayudó:fuente
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:
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.
fuente
Gracias a la respuesta de @Aurelien Porte. Aqui esta mi solucion
Causa de este problema: -
En ViewDidLoad: -
No hay necesidad de algo como esto: -
En
heightForHeaderInSection
delegado: -En
viewForHeaderInSection
delegado: -fuente
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
fuente
automaticallyAdjustsScrollViewInsets
en iOS 11Supongo que eso es solo parte del nuevo
UITableViewStyleGrouped
estilo. 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 todossubviews
losUITableView
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):
fuente
UITableViewCellScrollView
) en iOS7 nos ha enseñado una cosa, es dejar solo la jerarquía de vista de las clases integradas.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.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
Framework establecerá automáticamente el contenido precalculado .
Para evitar esto puedes hacer
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
fuente
self.automaticallyAdjustsScrollViewInsets = false
Este código funcionó para mí, la mejor respuesta para mí que estaba escrita en la parte
objective-C
superior, así que la convertí en Swift.Simplemente escriba esto
viewDidLoad()
y funcionará como un encanto.fuente
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.
fuente
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ó.
fuente
Lo único que funcionó para mí fue:
Rápido :
Objetivo-C :
Además, todavía tenía un espacio extra para la primera sección. Eso fue porque estaba usando la
tableHeaderView
propiedad incorrectamente. También se solucionó agregando:fuente
Código Swift 4: para la vista de tabla sin encabezados de sección, puede agregar este código:
y obtendrá el espacio del encabezado a 0.
Si desea un encabezado de su altura específica, pase ese valor:
y la vista del delegado viewForHeaderinSection.
fuente
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.
fuente
use este creo que esta ayuda ...
fuente
fuente