2008-10-19 16 views
7

Por razones de rendimiento, dibujo las cadenas para mi UITableViewCell en una vista personalizada que reemplaza su método drawRect para dibujar cadenas directamente en el rectángulo de vista usando NSString: drawInRect. Esto es similar al Ejemplo 5 TableViewSuite de Apple: CustomTableViewCell.¿Cómo hacer que un UITableViewCell dibujado a medida cambie de tamaño correctamente?

Sin embargo, cuando invoco setEditing en la célula para que aparezca el botón de borrar, la vista llega a tener una apariencia exprimido después de la animación completa. Para demostrar esto, invoque setEditing: YES en el ejemplo CustomTableViewCell mencionado anteriormente y observe la distorsión. ¿Hay alguna forma de evitar esto o debería volver a usar UILabels para mi texto?

Respuesta

5

Tuve un problema similar con una UIView dentro de una UITableViewCell. Lo resolví cambiando el contentMode de UIView al UIViewContentModeLeft. (Lo escribí here, con capturas de pantalla.)

2

Tuve este problema también, y en mi caso lo arreglé manejando los 2 estados en mi método drawRect, uno mientras editaba, el otro mientras no. En otras palabras, tomé en cuenta el tamaño del botón Eliminar y obtuve mi UI para volver a pintar la celda de manera diferente. No estoy seguro de si se trata de la forma más eficiente para ir, pero aquí está el código que he usado para forzar un repintado:

-(void)_refreshTableAndCells{ 
    //refresh the table 
    [myCustomTableView reloadData]; 
    //refresh all the visible cells 
    for (UITableViewCell *cell in myCustomTableView.visibleCells){ 
     LocationCellView *locationCell = [cell.contentView.subviews objectAtIndex:0]; 
     [locationCell setNeedsDisplay]; 
    } 

} 

Soy un n00b Objective-C, sin embargo, por lo que estaría más que feliz de que alguien sugiera una mejor manera que esto.

0

intente configurar el contentMode de su propia vista personalizada (que reside en el interior de la célula contentView) a UIViewContentModeLeft. El "exprimir" se debe al hecho de que el modo de contenido predeterminado es UIViewContentModeScaleToFill.

1

Normalmente solo modifico los valores x y ancho (o lo que sea) de lo que quiera que sea diferente al editar o no. UITableView llama automáticamente al layoutSubviews cuando comienza a editar, por lo que no tiene que recorrer las celdas y hacerlo usted mismo.

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    CGFloat editingPadding = 5.0; 
    self.textLabel = CGRectMake((self.editing ? self.textLabel.frame.origin.x + editingPadding : self.textLabel.frame.origin.x), self.textLabel.origin.y, (self.editing ? self.textLabel.frame.size.width - editingPadding : self.textLabel.frame.size.width), self.textLabel.frame.size.height); 
} 
Cuestiones relacionadas