UITableView: la forma correcta de mostrar un separador para la última celda

La pregunta es cuál es la forma más correcta de mostrar un separador en la última celda en una tabla / sección.

Básicamente esto es lo que estoy buscando.

introduzca la descripción de la imagen aquí Esto es de la aplicación de música nativa, lo que me hace pensar que debería ser posible solo mediante UITableView , no utilizarían un API privado para separadores celulares, ¿verdad?

Sé que puedes escaping sin usar separadores reales, pero agregando una línea de píxeles en la parte inferior de la celda. Pero no soy fanático de este enfoque porque

  1. Cuando se selecciona / resalta una celda, su separador y el separador de la celda anterior se ocultan automáticamente (vea la segunda captura de pantalla con la opción "Tienes que estar loco"). Y esto es algo que quiero que manejen UITableView en lugar de hacerlo yo mismo si uso una línea de un píxel (que es especialmente útil cuando los separadores de celdas no se extienden hasta el borde de la vista de tabla, los separadores y el background de celda seleccionado no se ven muy bien juntos)
  2. Me gustaría mantener mis celdas lo más planas posible para mostrar el performance.

También hay algo en la reference UITableView que me hace pensar que hay una manera fácil de get lo que quiero:

En iOS 7 y versiones posteriores, los separadores de celdas no se extienden hasta el borde de la vista de tabla. Esta propiedad establece la inserción pnetworkingeterminada para todas las celdas de la tabla, al igual que rowHeight establece la altura pnetworkingeterminada para celdas. También se usa para administrar los separadores "extra" dibujados en la parte inferior de las tablas de estilo plano.

¿Alguien sabe exactamente cómo usar estos separadores "extra" dibujados en la parte inferior de las tablas de estilo simple? Porque esto es exactamente lo que necesito. Pensé que al asignar separatorInset a UITableView , no a UITableViewCell , haría el truco, pero no es así, la última célula sigue faltando su separador.

En este momento solo veo una opción: tener un pie de página de sección personalizado para imitar el separador de la última celda. Y esto no es bueno, especialmente si desea tener un pie de página de sección real utilizando tableView:titleForFooterInSection: method.

Esto funcionó a la perfección para que yo agregue un separador a la última celda. ¡que te diviertas!

 self.tableView.tableFooterView = [[UIView alloc] init]; 

Acabo de encontrar algo que funcione para mí. En pocas palabras: dé a su UITableView un tableFooterView y establezca el alto de su marco en 0 . Esto hace una demostración del separador real, con las inserciones correctas.

En más detalles: si está utilizando el guión gráfico, arrastre una vista UIV al final de su Vista de tabla (en la vista de tree a la izquierda) para que se muestre justo debajo de la celda Vista de tabla, en el mismo nivel jerárquico. Esto crea un tableFooterView. Por supuesto, esto también se puede hacer mediante progtwigción.

Luego, en la implementación de tu UITableViewController:

 UIView *footerView = self.tableView.tableFooterView; CGRect footerFrame = footerView.frame; footerFrame.size.height = 0; [footerView setFrame:footerFrame]; 

¡Avísame si eso funciona para ti! También podría funcionar para el primer separador si utiliza un tableHeaderView en su lugar, aunque no lo he probado.

esto hará exactamente lo que quiere … aunque la línea tome todo el ancho de la celda:

in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

 self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; self.tableView.separatorColor = [UIColor networkingColor]; self.tableView.separatorInset = UIEdgeInsetsZero; 

Tuve un problema similar y encontré una solución. Apple oculta el último separador uitableviewcell y luego lo muestra si selecciona la celda o si llama, select y anule la selección en esa celda.

Así que enseñé que lo mejor está en - (void)layoutSubviews . La vista del separador se denomina _separatorView y es una propiedad privada. Usando los estados seleccionados / resaltados de la celda, puede encontrar algo como esto:

 - (void)layoutSubviews { // Call super so the OS can do it's layout first [super layoutSubviews]; // Get the separator view UIView *separatorView = [self valueForKey:@"_separatorView"]; // Make the custom inset CGRect newFrame = CGRectMake(0.0, 0.0, self.bounds.size.width, separatorView.frame.size.height); newFrame = CGRectInset(newFrame, 15.0, 0.0); [separatorView setFrame:newFrame]; // Show or hide the bar based on cell state if (!self.selected) { separatorView.hidden = NO; } if (self.isHighlighted) { separatorView.hidden = YES; } } 

Algo como esto.

Puede hacer algo como esto si no está usando secciones:

 - (void)viewDidLoad { self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(insetLeftSide, 0, width - insetRightSide, 1)]; } 

Si está utilizando secciones, aplique el pie de página en cada sección como una vista de un punto en los methods

 - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { } - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { } 

Esto le permitirá tener un separador para su última celda que, de hecho, no es un separador, es un pie de página con el que puede jugar y hacer que parezca un separador

En iOS 8, si tiene un estilo simple UITableView y agrega un pie de página, el último separador desaparecerá. Sin embargo, puede volver a crearlo fácilmente agregando una vista separadora personalizada al pie de página.

Este ejemplo imita exactamente el estilo de separador de Widget de hoy

  override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { //create footer view let result = UIView() result.frame.size.height = tableView.rowHeight //recreate last cell separator, which gets hidden by footer let sepFrame = CGRectMake(15, -0.5, tableView.frame.width, 0.5); let vibrancyEffectView = UIVisualEffectView.init(effect: UIVibrancyEffect.notificationCenterVibrancyEffect()) vibrancyEffectView.frame = sepFrame vibrancyEffectView.contentView.backgroundColor = tableView.separatorColor result.addSubview(vibrancyEffectView) return result } 

Si agrega un pie de página vacío, la vista de tabla eliminará todos los separadores de línea restantes (para celdas no existentes), pero aún includeá el separador para la última celda:

 - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return [UIView new]; } 

Funciona en iOS 7.xy 8.x (ponlo en cellForRowAtIndexPath):

(Sustituto de PS "elementos máximos de su fuente de datos" con su recuento de fonts de datos de array)

  if (row == <max elements of your datasource>-1) { UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height-1, self.view.frame.size.width, 1)];/// change size as you need. separatorLineView.tag = 666; separatorLineView.backgroundColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0]; UIView *separator = [cell.contentView viewWithTag:666]; // case of orientation changed.. if (separator.frame.size.width != cell.contentView.frame.size.width) { [[cell.contentView viewWithTag:666] removeFromSuperview]; separator = nil; } if (separator==nil) [cell.contentView addSubview:separatorLineView]; } 

Esto definitivamente es ayuda. Trabajando. pero establezca el separador "ninguno" del inspector de attributes. Escriba el código siguiente en el método cellForRowAtIndexPath

 if(indexPath.row==arrData.count-1){ UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width, 1)]; lineView.backgroundColor = [UIColor blackColor]; [cell.contentView addSubview:lineView]; }