2009-06-20 15 views
21

Si tiene una UITableView simple (no agrupada) con una sola fila, el resto de la pantalla está llena de celdas vacías o en blanco. ¿Cómo cambias la apariencia de estas celdas en blanco? Af primero, pensé que tendrían la apariencia de la celda utilizada en la vista de tabla, pero parece que no.¿Cómo puedo modificar la apariencia de las celdas 'vacías' en la versión sencilla de UITableView?

La gente de Cultured Code (Things) ha hecho un buen trabajo al modificar estas celdas, pero no puedo pensar inmediatamente en una forma de cambiar su apariencia.

¿Algún consejo?

+0

* * Bump obtuvo una solución que funcione? Por favor comparte aquí. Gracias – lostInTransit

+0

Lo que he hecho hasta ahora es agregar una celda 'invisible' al final de la vista de tabla con una vista de imagen que muestra la sombra del final de la vista de tabla. Establecí el estilo de separador en ninguno. Esto crea un efecto similar, pero tendré que ajustarlo un poco más para estar contento con él. –

Respuesta

20

Aunque no es exactamente lo que está buscando, también se puede cambiar a simplemente mostrar una región en blanco (en lugar de celdas en blanco) mediante el establecimiento de una visión pie de página en la tabla. Una UIView de altura 0 hará el truco.

+1

Con su ayuda, lo descubrí y es bastante simple. Agregue el UIImageView deseado al pie de página de UITableView (como sugirió), pero para que la vista de tabla se comporte correctamente, debe aumentar su altura con el alto del UIImageView. De esta manera, la vista de tabla se comportará como una vista de tabla normal, pero tiene el bonito efecto que estaba buscando. Asegúrese de eliminar los separadores de celdas de la vista de tabla. –

+0

¿Tiene algún código para esto que funcione? Tengo problemas para reproducir lo que se explica aquí –

+0

Esto es lo que funcionó para mí. En iOS 6.1, no parece que deba aumentar el alto de la vista: myTableView.tableFooterView = [[[UIView alloc] initWithFrame: CGRectZero] liberación automática]; –

0

Probablemente tendrá que hacer 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 
} 
5

Establecí una subclase UIView de ~ 300 px de alto en mi tableView vistas de encabezado y pie de página, 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 yo uso CGContextDrawTiledImage() dibujar un vacío UITableViewCell repetitivamente:

- (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 mis tableviewcells son 46 píxeles de alto, así que si quiero hacer UIView subclase que contiene 8 de estas celdas vacías, necesito hacerlo 368px de alto.

+0

Me gusta esta solución, pero podría usar algunos ajustes. Por un lado, creo que la asignación de una mesa de visión solo para dibujar es bastante pesada. La idea detrás de esto es bastante genial: las celdas vacías reflejarán automágicamente cualquier cambio que realice en el diseño personalizado de la mesa de visión. Sin embargo, me gustaría imaginar que el diseño no cambiará muy a menudo, por lo que probablemente no exista un buen caso de uso para utilizar este enfoque genérico. Más bien, simplemente crearía una imagen a partir de cómo se ve la célula y la usaré. – memmons

+1

Además, no soy fanático de los números mágicos en el código. Veo por qué se ven obligados a usarlos aquí. Necesita saber el marco de contexto antes de cargar la celda vacía, pero en realidad debería dibujar el tamaño correcto que se le da. – memmons

+0

Teniendo en cuenta lo anterior, agregué una respuesta basada en su código, pero que toma la imagen de fondo directamente en lugar de usar una tableViewCell real. Sin embargo, di esta respuesta +1 también porque creo que es un enfoque interesante y viable. – memmons

7

Basado en samvermette's respuesta, pero modificado para usar una imagen de fondo directamente en lugar de componer una imagen de una subclase de UITableViewCell. La respuesta de Sam es buena, pero será menos eficaz que crear una imagen de fondo directamente.

Crear una subclase UIView - en este ejemplo lo llamé CustomTiledView - y agregue el código siguiente 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 código siguiente 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]; 
} 

Por último, deberá establecer el recuadro de contenido inferior de su tabla de visión negativa del valor devuelto por -tableView:heightForFooterInsection:. En este ejemplo, sería -1*BACKGROUND_IMAGE_HEIGHT*9. Puede establecer el recuadro de contenido inferior desde el Inspector de tamaño del Constructor de interfaz o configurando la propiedad self.tableView.contentInset desde el controlador de vista de tabla.

¡Salud!

0

Creo que el enfoque de utilizar el método UITableViewtableView:viewForFooterInSection: no funcionará para el caso en que la tabla esté vacía, es decir, sin celdas.En ese caso, se puede utilizar la técnica Answerbot propuestos pueden ser reutilizados para rellenar el UIView creado a la vista de pie de página de la tabla de manera explícita, 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; 
1

Si simplemente desea cambiar la altura de las "celdas vacías "cuando no hay celdas en su TableView: necesita configurar la propiedad rowHeight de su UITableView (la implementación de tableView:heightForRowAtIndexPath: no tiene ningún efecto sobre 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.

+0

Esto cambiará la altura de todas las celdas, independientemente de lo que 'tableView: heightForRowAtIndexPath:' haga. – executor21

+0

@ executor21: no es verdadero, 'tableView: heightForRowAtIndexPath:' siempre anula el valor que establece a través de la propiedad 'rowHeight', pero solo se aplicará si hay al menos una celda. –

3

De http://jomnius.blogspot.com/2011/03/hide-uitableview-empty-cell-separator.html forma fácil es definir que la tabla no tiene líneas de separación celular:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

manera 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 celular como parte de UITableViewCell personalizado. Parte inferior de la celda, obviamente, y lo más probable es que use una imagen gráfica realmente delgada. Recuerde definir el modo automático y el modo de imagen correctamente.

Otra forma es definir un vacío tableFooterView de UITableView:

UIView *footer = 
    [[UIView alloc] initWithFrame:CGRectZero]; 
self.myTable.tableFooterView = footer; 
[footer release]; 
Cuestiones relacionadas