2011-12-06 5 views
5

El alto de fila más allá de la última fila en TableView (las filas de marcador de posición vacías que están allí para detalles visuales si el número de elementos es menor que el número de filas que TableView puede mostrar a la vez) es siempre el mismo última fila de altura¿Es posible cambiar la altura de las filas de marcador de posición en UITableView sin crear una fila ficticia?

¿Es posible cambiar esto sin recurrir a la adición de una última fila ficticia?

Screenshot

+1

No hay fila más allá de la última fila en una Vista de tabla (a menos que no esté entendiendo bien la palabra * último *). – PengOne

+0

@PengOne Me refiero a las filas de marcador de posición que están allí cuando el número de elementos es menor que el número de filas que puede acomodar TableView. – pixelfreak

+1

cambiar el tamaño de la altura del marco tableView para ocultar las filas marcador de posición? – changx

Respuesta

1

El método privado UITableView ejemplo _spacingForExtraSeparators devuelve la altura de las filas de marcador de posición. Si no está escribiendo una aplicación para la App Store, simplemente anule eso. Devuelve un CGFloat.

Aquí hay un enfoque diferente que cumple con App Store (hasta donde yo sé), y podría ser más fácil que crear una fila ficticia.

UITableView se envía a sí mismo el mensaje layoutSubviews mucho. Lo hace cada vez que agrega, elimina o reorganiza celdas, y cada vez que se desplaza (y probablemente también otras veces). De modo que anulemos layoutSubviews para dibujar una vista que comience en el borde inferior de la última sección de la vista de tabla. La vista se rellenará con un patrón repetitivo que se parece a las celdas de marcador de posición, con una altura que defina.

Crea una subclase de UITableView. Dé a su subclase una variable de instancia UIView *_bottomView. Necesitamos sobrescribir layoutSubviews, por lo que inicializaremos _bottomView perezosamente en ese método.

@implementation MyTableView 
{ 
    UIView *_bottomView; 
} 

Override layoutSubviews. Lo primero que debe hacer en su layoutSubviews es llamar al [super layoutSubviews], por lo que seguirá actuando como un UITableView.

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

La siguiente cosa que se hace es con pereza inicializar _bottomView.

if (!_bottomView) { 

Se necesita un patrón para llenar _bottomView, y tiene que parecerse a las células de marcador de posición. Cree un contexto de imagen de 1 píxel de ancho y tan alto como desee que sea una celda de marcador de posición. Rellena el contexto con blanco y pinta una línea de separación (píxel, realmente) en la parte inferior. Obtener la imagen del contexto.

 UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, placeholderHeight), YES, 0); 
     [[UIColor whiteColor] setFill]; 
     UIRectFill(CGRectMake(0, 0, 1, placeholderHeight)); 
     [self.separatorColor setFill]; 
     UIRectFill(CGRectMake(0, placeholderHeight - 1, 1, 1)); 
     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

A continuación, cree _bottomView, establece sus antecedentes "color" a esa imagen como un patrón de repetición, y añadirlo a sí mismo como un subvista.

 _bottomView = [[UIView alloc] initWithFrame:CGRectZero]; 
     _bottomView.opaque = YES; 
     _bottomView.backgroundColor = [UIColor colorWithPatternImage:image]; 
     [self addSubview:_bottomView]; 
    } // end of if-block 

Finalmente, encuentre el rect de su última sección. Use ese rect para calcular un marco para _bottomView que comienza en la parte inferior de la última sección, es bastante alto (el doble de su altura es más que suficiente), y es tan ancho como el rect de la última sección.

int lastSectionIndex = [self.dataSource numberOfSectionsInTableView:self] - 1; 
    if (lastSectionIndex < 0) 
     lastSectionIndex = 0; 
    CGRect lastSectionRect = [self rectForSection:lastSectionIndex]; 
    CGRect bottomViewFrame = CGRectMake(lastSectionRect.origin.x, CGRectGetMaxY(lastSectionRect), lastSectionRect.size.width, self.bounds.size.height * 2); 
    _bottomView.frame = bottomViewFrame; 

Por último, asegúrese de _bottomView es su vista secundaria situada en primer plano por lo que sobregirar UITableView 's células de marcador de posición.

[self bringSubviewToFront:_bottomView]; 
} // end of layoutSubviews 

Fin.

@end 
+0

He cambiado mi respuesta. Esto debería ser más fácil que usar una fila ficticia. –

+0

Wow, gracias por la respuesta detallada :) Sin embargo, no estoy seguro si esto es más fácil que usar una fila ficticia. Solo toma 7 líneas de código para mí. – pixelfreak

+0

Supongo que depende de la complejidad de su modelo, si permite la edición, si utiliza un menú de fila, etc. –

0

No creo que haya una API pública para hacerlo. Es razonable usar la última altura de fila como la altura de las filas de marcador de posición.

Si insistes en cambiar la altura de las filas del marcador de posición, como sé, agregar una celda ficticia vacía al final de tus celdas es la única forma de hacerlo.

Justo como lo has hecho.

Cuestiones relacionadas