ios uitableview ios7

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



(30)

A partir de iOS7, hay espacio adicional en la parte superior de mis UITableView que tienen 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 una vista UIView devuelta 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 ?


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

Seleccione Vista de tabla> Inspector de tamaño> Plantillas de contenido: Nunca


Así que estaba probando todos los métodos aquí, y esta vez ninguno de ellos me ayudó. Mi caso fue una vista de tabla agrupada en iOS 9. Realmente no sé por qué y cómo descubrí esta, pero para mí, configurar el tableViewHeader con una UIView con al menos 0.01 altura UIView . CGRectZero no ayudó, nada realmente ayudó:

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


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

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


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 el UITableView debe establecer esta propiedad en NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Esto hará el truco.

EDITAR 1:

Además, uno podría intentar ...

self.navigationController.navigationBar.translucent = YES;

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


Desmarque "Ajustar inserciones de vista de desplazamiento"


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; }


Gracias a la respuesta de @Aurelien Porte. Aquí está mi solución

Causa de este problema: -

  1. a UITableView no le gusta tener un encabezado con una altura de 0.0. Si lo que intentas hacer es tener un encabezado con una altura de 0, puedes saltar a la solución.
  2. incluso si luego asigna una altura distinta a 0.0 a su encabezado, a un UITableView no le gusta que se le asigne una cabecera 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 el delegado de heightForHeaderInSection : -

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

En el delegado de viewForHeaderInSection :

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 }


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 35px en la parte superior que nunca desaparecerá.

Ver 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 el tableView almacene en caché un resultado en algún lugar y no se vuelva a dibujar después de que se establezca el delegado y se llame a reloadData.


Intente cambiar la propiedad UITableView que UITableView hereda de UIScrollView .

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

Es una solución, pero funciona


Jugué un poco más con él y parece que esto es un efecto secundario de configurar tableView tableHeaderView = nil .

Debido a que mi tableView tiene un tableHeaderView aparece dinámicamente, cuando necesito ocultar el tableHeaderView , en lugar de hacer 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 esta solución mejor que configurar un contentInset.top algo arbitrario porque también uso el contentInset.top dinámicamente. Tener que recordar eliminar un 35px extra cada vez que recalculo contentInset.top es tedioso.


Lo único que me funcionó fue:

Swift :

tableView.sectionHeaderHeight = 0 tableView.sectionFooterHeight = 0

Objective-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 propiedad tableHeaderView incorrectamente. Arreglado eso también agregando:

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


Me ayudó lo siguiente:

YouStoryboard.storyboard> YouViewController> Inspector de atributos> Desmarcar - Ajustar inserciones de vista de desplazamiento.


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

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

self.navigationController.navigationBar.translucent = YES;

marco automáticamente establecerá contentInset precalculado .

Para evitar esto puedes hacer

self.automaticallyAdjustsScrollViewInsets = NO;

pero en mi caso no pude hacer esto, porque estaba implementando SDK que tiene un componente UIView que puede ser usado por 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á las inserciones automáticas.

He corregido esto agregando la vista ficticia con el 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


Mientras usa TableView agrupado, use esto para evitar el corte de bordes en viewWillAppear

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


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

Raíz de la cuestión:

  1. a UITableView no le gusta tener un encabezado con una altura de 0.0. Si lo que intentas hacer es tener un encabezado con una altura de 0, puedes saltar a la solución.

  2. incluso si luego asigna una altura distinta a 0.0 a su encabezado, a un UITableView no le gusta que se le asigne una cabecera 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 de su encabezado no sea 0 cuando lo asigne a su vista de 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 (normalmente, 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;


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

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

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


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

self.edgesForExtendedLayout = UIRectEdgeNone;

Tu problema me pareció similar al mío.

Actualizar:

Swift en iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)


Para ser específico, para eliminar el espacio de tableviewHeader de la parte superior, hice estos cambios:

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


Podría detectar si su aplicación está ejecutando iOS7 o superior y agregar estos dos métodos a 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; }

Tal vez no sea una solución elegante pero funciona para mí.


Simplemente agregue lo siguiente a su viewDidLoad en su VC:

self.automaticallyAdjustsScrollViewInsets = NO;


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

Si ese espacio está representado por una UIView , sería posible buscar en todas las subviews de la UITableView de UITableView 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 haya ninguna forma de editarlo.

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

- (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]; } }


Swift: iOS Tuve vista de tabla en la vista de desplazamiento ... cuando estaba haciendo clic en "Atrás" en la misma pantalla. La vista de desplazamiento tiene 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 al controlador de vista ajustar 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 la barra de pestañas. Establézcalo en falso si desea administrar los ajustes de inserción de vista de desplazamiento usted mismo, como cuando hay más de una vista de desplazamiento en la jerarquía de vistas.


Tenemos múltiples respuestas para esto.

1) Puedes agregar UIImageview en la vista de carga

UIImageView * imbBackground = [UIImageView new]; [self.view addSubview:imbBackground];

2) Puedes configurar el encabezado y el pie de página 0.1

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

3) Puede agregar una vista de encabezado y pie de página con altura 0.1

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


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. Enviaré un error de radar más adelante si puedo reproducirlo en una aplicación de demostración simple.


usa este creo que esta ayuda ...

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0.005f;// set this according to that you want... }


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

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

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


Guión gráfico:

Simplemente desmarque: Adjust Scroll View Insets en las opciones del controlador de vista

Código:

self.automaticallyAdjustsScrollViewInsets = false


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

¡Eso es todo amigos!


override func viewWillAppear(animated: Bool) { self.edgesForExtendedLayout = UIRectEdge.None // OR self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0); //OR self.automaticallyAdjustsScrollViewInsets = false }


self.automaticallyAdjustsScrollViewInsets = NO;

Intenta, puedes lidiar con eso!