¿Cómo puedo modificar la apariencia de las celdas 'vacías' en UITableView simple?
-
06-07-2019 - |
Pregunta
Si tiene un UITableView simple (no agrupado) con una sola fila, el resto de la pantalla se llena con celdas en blanco o vacías. ¿Cómo se cambia la apariencia de estas celdas en blanco? Primero, pensé que tendrían la apariencia de la celda utilizada en la vista de tabla, pero parece que no.
La gente de Cultured Code (Things) ha hecho un buen trabajo modificando estas celdas, pero no puedo pensar de inmediato en una forma de cambiar su apariencia.
¿Algún consejo?
Solución
Aunque no es exactamente lo que está buscando, también puede cambiarlo para mostrar solo una región en blanco (en lugar de celdas en blanco) configurando una vista de pie de página en la tabla. Un UIView de altura 0 hará el truco.
Otros consejos
Basado en respuesta de samvermette , pero modificado para usar una imagen de fondo directamente en lugar de componer una imagen de una subclase UITableViewCell. La respuesta de Sam es buena, pero será menos eficaz que simplemente crear una imagen de fondo directamente.
Cree una subclase UIView, en este ejemplo lo llamé CustomTiledView, y agregue el siguiente código a la clase:
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed:@"tableview_empty_cell_image"];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM (context, 1, -1);
CGContextDrawTiledImage(context,
CGRectMake(0, 0, rect.size.width, image.size.height),
[image CGImage]);
}
Agregue el siguiente código a su tableviewcontroller:
- (CGFloat)tableView:(UITableView *)tableView
heightForFooterInSection:(NSInteger)section {
// this can be any size, but it should be 1) multiple of the
// background image height so the last empty cell drawn
// is not cut off, 2) tall enough that footer cells
// cover the entire tableview height when the tableview
// is empty, 3) tall enough that pulling up on an empty
// tableview does not reveal the background.
return BACKGROUND_IMAGE_HEIGHT * 9; // create 9 empty cells
}
- (UIView *)tableView:(UITableView *)tableView
viewForFooterInSection:(NSInteger)section {
CustomTiledView *footerView = [[CustomTiledView alloc] init];
return [footerView autorelease];
}
Finalmente, deberá establecer el contenido del contenido inferior de su vista de tabla en el valor negativo del valor devuelto por -tableView: heightForFooterInsection:
En este ejemplo sería -1 * BACKGROUND_IMAGE_HEIGHT * 9
. Puede configurar el contenido del recuadro inferior desde el Inspector de tamaño de Interface Builder o configurando la propiedad self.tableView.contentInset
desde tableviewcontroller.
¡Salud!
Establecí una subclase UIView de ~ 300 px de alto en mis vistas de encabezado y pie de tabla tableView, ajustando las inserciones tableView para que compensen estas vistas (establezca las inserciones superior e inferior en -300px).
Mi subclase UIView implementa el método drawRect, en el que uso CGContextDrawTiledImage ()
para dibujar un UITableViewCell
vacío repetidamente:
- (void)drawRect:(CGRect)rect {
UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 46),NO,0.0);
emptyCell = [[SWTableViewCell alloc] initWithFrame:CGRectZero];
[emptyCell drawRect:CGRectMake(0, 0, 300, 46)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
[emptyCell release];
UIGraphicsEndImageContext();
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM (context, 1, -1); // this prevents the image from getting drawn upside-down
CGContextDrawTiledImage(context, CGRectMake(0, 0, 300, 46), [newImage CGImage]);
}
En mi caso, las celdas de mi mesa tienen 46 píxeles de alto, por lo que si quiero que la subclase UIView contenga 8 de estas celdas vacías, necesito que tenga 368 píxeles de alto.
De http://jomnius.blogspot.com /2011/03/hide-uitableview-empty-cell-separator.html La manera fácil es definir que la tabla no tiene líneas de separación de celdas:
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
La forma difícil, si necesita líneas de separación, es definir que la tabla no tiene líneas de separación y crear líneas de separación de celdas como parte de UITableViewCell personalizada. Parte inferior de la celda, obviamente, y muy probablemente usando una imagen gráfica realmente delgada. Recuerde definir el modo y el tamaño automático de la imagen correctamente.
Otra forma es definir una tabla vacía de UITableViewFooterView:
UIView *footer =
[[UIView alloc] initWithFrame:CGRectZero];
self.myTable.tableFooterView = footer;
[footer release];
Si simplemente desea cambiar la altura de las "celdas vacías" cuando no hay celdas en su TableView: debe establecer la propiedad rowHeight
de su UITableView (la implementación de tableView: heightForRowAtIndexPath:
no tiene efecto en TableViews vacías) . Si hay celdas en su TableView y ha implementado tableView: heightForRowAtIndexPath:
, la altura de la última fila se usará para celdas vacías.
Probablemente tendrá que crear una subclase personalizada de UITableView que llene el fondo con la apariencia de celdas en blanco.
- (void)drawRect:(CGRect)rect {
[super drawRect: rect];
// draw your background here if the rect intersects with the background area
}
Creo que el método de usar el método UITableView
tableView: viewForFooterInSection:
no funcionará en el caso en que la tabla esté vacía, es decir, sin celdas. En ese caso, puede utilizar la técnica Answerbot propuesta puede reutilizarse para rellenar el UIView
creado en la vista de pie de página de la tabla explícitamente, como la siguiente:
CGRect cellRect = CGRectMake(0, 0, table.bounds.size.width, table.bounds.size.height);
CustomTiledView *footerView = [[[CustomTiledView alloc] initWithFrame:cellRect] autorelease];
table.tableFooterView = footerView;
Para sws 4.0 :
self.tableView.tableFooterView = UIView(frame: CGRect.zero)