UITableView separator comportamiento extraño

Tengo una table de estilo simple, con múltiples secciones.

Síntomas: cuando la tabla se carga por primera vez, cada celda tiene su separador de manera normal, excepto la última celda de cada sección (es decir, "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 printing de la jerarquía de vista muestra, que al inicio limpio, la vista del separador de la última celda en cada sección está oculta, por lo que supondría que sería el comportamiento normal:

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

Al desplazarse a veces; y seleccionando la celda; esta propiedad oculta se elimina y, por lo tanto, aparece el separador.

Primero supuse que estaba haciendo algo mal; pero esto también ocurre con la aplicación hello world más básica:

 - (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 (a la izquierda: después del inicio; a la derecha: después de seleccionar una celda):

comienzodespués de seleccionar una celda

¿Esto es 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 está oculto encima de un encabezado de sección …

** Actualización: **

Fue capaz de reproducir esto en la aplicación de música de stock: por ejemplo, pestaña Canciones, sin lanza. Seleccione luego anular la selección de la primera celda de cualquier sección; Aparece el separador.

Información adicional: iOS 7.1

Dado que se trata de un error de iOS 7.1, como alternativa, sugeriría ocultar el separador incorporado y mostrar uno propio 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 de true .

introduzca la descripción de la imagen aquí

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

Oculte el separador de celdas pnetworkingeterminado de tableView como :

  [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 

Agregue una 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)]; } 

Tuve este problema en una situación un tanto diferente, mis celdas están en modo de edición pero no debería importar. En mi caso, no quería mostrar la parte inferior _UITableViewCellSeparatorView después de seleccionar una celda así que después de mirar a través de las subvistas de la celda NSLog(@"%@", [cell.subviews[0] subviews]); Yo vi

 ( "<_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>>" ) 

que hizo más fácil encontrar y eliminar las molestas vistas separadoras al usar esto

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

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

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

Tenga en count que puse este código en mi delegado didHighlightRowAtIndexPath . Además, mi celda selectionStyle está establecida en el valor pnetworkingeterminado. Espero que esto ayude a alguien!