2010-09-15 19 views
8

He subclasificado UITableViewCell para crear una celda personalizada con un botón y 2 etiquetas. La definición de celda se carga desde un xib usando el patrón descrito en el Desarrollo de iPhone Principiante de Dave Mark. Aquí está el código esencial:No se puede sangrar la subclase UITableViewCell

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MarketItemCustomCell" owner:self options:nil]; 

    for (id oneObject in nib) 
    { 
     if ([oneObject isKindOfClass:[MarketItemCustomCell class]]) 
     { 
      cell = (MarketItemCustomCell *)oneObject; 
      break; 
     } 
    } 

Las etiquetas y el botón se muestran como se esperaba, pero no se respeta el nivel de sangría. He implementado indentationLevelForRowAtIndexPath como a continuación, pero la celda todavía está alineada completamente a la izquierda.

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     <snip/> 
     return 5; 
    } 

Tenga en cuenta que el nivel de sangría funciona bien cuando no estoy utilizando una celda personalizada.

¿Alguna pista?

Respuesta

21

Actualización para iOS 8: El código de abajo ya no funciona por alguna razón

sugerencia alternativa para iOS 8:

considerar la creación de una restricción de diseño automático para representar el margen izquierdo sangría

en tiempo de ejecución, modificar esta restricción al cambio el nivel de sangría

Si tiene una subclase de UITableViewCell personalizada, esta subclase puede tener un IBOutlet correlacionado con la restricción. (Lamentablemente, Apple no proporcionó una función findConstraintByTag/Id)

La propiedad irónicamente nombrada "constante" de NSLayoutConstraint se puede modificar para cambiar el nivel de indentación.

Para iOS 7, esto funciona (pero ya no se debe recomendar)

Sobre la base de la sugerencia de vodkhang, he implementado la siguiente solución en mi sublass UITableViewCell. No estoy seguro de si esta es la mejor solución, pero parece funcionar bien.

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    float indentPoints = self.indentationLevel * self.indentationWidth; 

    self.contentView.frame = CGRectMake(indentPoints, 
              self.contentView.frame.origin.y, 
              self.contentView.frame.size.width - indentPoints, 
              self.contentView.frame.size.height); 
} 
+0

¡Esto funciona perfectamente! – Nathan

+1

Esto es excelente para sangrar la vista de contenido, ¡gracias! ¿Qué hay de sangrar la celda en sí? Pensé que eliminaría contentView de lo anterior y veré para ver si indentationLevel no es 0, pero parece asqueroso. –

+3

código anterior se cuelga en iOS8 – Gerry

1

Creo que debe personalizar el nivel de sangría en su UITableViewCell personalizado. Creo que este método (y métodos como – tableView:heightForRowAtIndexPath:) no afectará en el caso de UITableViewCell si su aduana UITableViewCell ya se especifica que

0

Si el diseño de un UITableViewCell en un xib, que va a utilizar la propiedad de celda CustomView, que no utiliza la sangría automáticamente. Puede subclasificar UITableViewCell e implementar layoutSubviews para cambiar su marco basado en la sangría o puede hacer lo mismo desde donde configure sus celdas en su delegado de tabla o fuente de datos. Me gustaría que Apple implementara la sangría para las celdas personalizadas.

Cuestiones relacionadas