ios objective-c uitableview uikit

ios - UITableView separador de comportamiento extraño



objective-c uikit (4)

A medida que se produce iOS 7 en adelante, sugiero seguir pasos difíciles que funcionan bien para evitar este escenario.

Ocultar el separador de celdas predeterminado de tableView como :

[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

Agregue vista personalizada a su celda personalizada como :

CustomCell.h @property (nonatomic,strong) UIView* cellSeperatorView; CustomCell.m @synthesize cellSeperatorView; -(UIView *)cellSeperatorView{ if (!cellSeperatorView) { self.cellSeperatorView = [[UIView alloc] initWithFrame:CGRectZero]; [self.cellSeperatorView setBackgroundColor:[UIColor lightGrayColor]]; [self addSubview:self.cellSeperatorView]; } return cellSeperatorView; } -(void)prepareForReuse{ self.cellSeperatorView = nil; } -(void)layoutSubviews{ [super layoutSubviews]; [self.cellSeperatorView setFrame:CGRectMake(0, 100, self.width, 1)]; }

Tengo una mesa de estilo plano, con múltiples secciones.

Síntomas: cuando la tabla se carga por primera vez, cada celda tiene su separador como normal, excepto la última celda de cada sección (que es "antes" de un encabezado). Sin embargo, cuando hay desplazamiento, en algunas celdas aparece el separador. Además, si se selecciona una celda, luego se deselecciona, aparece el separador.

La impresión de la jerarquía de vistas muestra que, en el inicio limpio, la vista separadora de la última celda de cada sección está oculta, por lo que supongo que ese sería el comportamiento normal:

<_UITableViewCellSeparatorView: 0x145b1990; frame = (0 47.5; 320 0.5); hidden = YES; layer = <CALayer: 0x145b2950>>

En desplazamiento a veces; y seleccionando la celda; esta propiedad oculta se elimina, y así aparece el separador.

La primera suposición era que estaba haciendo algo mal; Pero esto sucede también con la aplicación más básica de hello world:

- (void)viewDidLoad { [super viewDidLoad]; [self.tableView reloadData]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 4; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 2; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return @"test"; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *reuseIdentifier = @"TestCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; return cell; }

Pantallas (izquierda: después de comenzar; derecha: después de seleccionar una celda):

¿Es esto un error en el lado de Apple, o me estoy perdiendo algo? Además, por ejemplo, en la aplicación Contactos de iOS, el separador nunca se oculta sobre el encabezado de una sección ...

** Actualización: **

Pude reproducir esto en stock Aplicación de música: por ejemplo, pestaña Canciones, sin spearator. Seleccione luego deseleccione la primera celda de cualquier sección; Aparece el separador.

Información adicional: iOS 7.1


Aunque tuve este problema en una situación algo diferente, mis celdas están en modo de edición, pero no debería importar. En mi caso, no quería que se mostrara _UITableViewCellSeparatorView inferior después de seleccionar una celda, así que después de mirar las subvistas de la celda NSLog(@"%@", [cell.subviews[0] subviews]); He visto

( "<_UITableViewCellSeparatorView: 0x9df7f30; frame = (0 99; 280 1); layer = <CALayer: 0x9dfb800>>", "<UITableViewCellContentView: 0x9d65950; frame = (38 0; 242 99.5); opaque = NO; gestureRecognizers = <NSArray: 0x9d2e0d0>; layer = <CALayer: 0x9de8290>>", "<_UITableViewCellSeparatorView: 0x9dfab90; frame = (0 99.5; 280 0.5); layer = <CALayer: 0x9dfb7d0>>", "<UITableViewCellEditControl: 0x9df3f60; frame = (0 0; 47 100); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9d91370>>", "<UIView: 0x9df4470; frame = (0 98; 280 3); layer = <CALayer: 0x9df44d0>>", "<UIView: 0x9d35f10; frame = (0 98; 280 3); layer = <CALayer: 0x9d39e20>>" )

lo que hizo que sea más fácil encontrar y deshacerse de las molestas vistas de los separadores usando este

[[[cell.subviews[0] subviews] objectAtIndex:2] setBackgroundColor:[UIColor clearColor]];

Por alguna razón, no tengo un problema con la vista del separador superior, probablemente porque mi encabezado en cada sección tiene un color de fondo oscuro que oculta la vista del separador, pero si desea cubrirlos probablemente podría agregar este código

[[[cell.subviews[0] subviews] firstObject] setBackgroundColor:[UIColor clearColor]];

Tenga en cuenta que puse este código en mi delegado didHighlightRowAtIndexPath . Además, mi celda selectionStyle está configurada por defecto. Espero que esto ayude a alguien por ahí!


Como se trata de un error de iOS 7.1, como solución alternativa, sugeriría ocultar el separador incorporado y mostrar uno de los suyos en la parte inferior de cada celda.

Ocultando el separador incorporado:

[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

Mostrando un separador personalizado:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *reuseIdentifier = @"TestCell"; XXYourCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; cell.customSeparatorView.hidden = (indexPath.row == ([self numberOfRowsInSection:indexPath.section] - 1)); return cell; }


En mi caso, fue el Clip To Bounds en el UITableViewCell personalizado. Accidentalmente lo deseleccioné del guión gráfico. Luego, nuevamente configurando Clip To Bounds para resolver este problema.