2009-10-17 9 views
11

Al escribir una subclase personalizada de UITableViewCell, encuentro que los resultados funcionan bien para las celdas rectangulares de un estilo simple UITableView, pero no funcionan en absoluto para las celdas redondeadas en una tabla de estilo agrupado.¿Cómo se puede establecer una subclase de UITableViewCell para el UITableView agrupado?

¿Hay alguna forma de subclase confiable UITableViewCell para dibujar celdas que funcionen para tablas de estilo agrupado? (Sin usar Interface Builder)

Respuesta

-1

¿Qué problema tienes? En drawRect te dan un rect, y conoces tu tamaño total, solo concuerda con ese espacio. Si está utilizando layoutSubviews, lo mismo.

+2

El problema es UITableView en modo agrupado corta partes de las células (los lados, para revelar el fondo y también redondea las esquinas de la parte superior y las células del fondo de una sección). – jbrennan

+0

Sí, ese es el problema. –

+1

Después de algunas pruebas adicionales, tiene razón en que las celdas de la vista de tabla no se pasan en el tamaño correcto en drawRect. Un enfoque alternativo es establecer una vista de fondo personalizada para una UITableViewCell estándar, y hacer todo su dibujo allí. Obtienes una celda del ancho correcto pero tienes que dibujar las esquinas redondeadas superior e inferior correctamente. –

2

He notado este problema también. Mi solución ha sido hacer que las celdas de mi tabla sean más pequeñas (300 de ancho en lugar de 320). No es una gran solución, pero funciona bien.

No creo que pueda deshacerse de las inserciones de la vista de tabla de forma individual cuando está en el modo "agrupado". ¡Podría estar equivocado sin embargo!

8

Solía ​​tener muchos problemas con las subclases UITableViewCell, pero luego dejé de crear subclases. Agregar subvistas a la propiedad contentView de UITableViewCell parece lograr lo mismo en cualquier instancia que he encontrado, así que lo hago dentro de mi UITableViewController.

Aquí hay un ejemplo que tiene un título y valor:

- (UITableViewCell *)tableView:(UITableView*)tableView 
     cellForRowAtIndexPath: (NSIndexPath*)indexPath 
{  
    static NSString* CellIdentifier = @"AccountDetailsCell"; 
    UILabel* mainLabel = nil; 
    UILabel* valueLabel = nil; 
    const CGFloat kAccountDetailFontSize = 14.0; 

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault 
             reuseIdentifier: CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0, 150.0, 44.0)] autorelease]; 
     mainLabel.tag = MAINLABEL_TAG; 
     mainLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize]; 
     mainLabel.textAlignment = UITextAlignmentLeft; 
     mainLabel.textColor = [UIColor darkGrayColor]; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
     mainLabel.backgroundColor = [UIColor clearColor]; 
     [cell.contentView addSubview: mainLabel]; 

     valueLabel = [[[UILabel alloc] initWithFrame: CGRectMake(150.0, 0.0, 150.0, 44.0)] autorelease]; 
     valueLabel.tag = VALUELABEL_TAG; 
     valueLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize]; 
     valueLabel.textAlignment = UITextAlignmentRight; 
     valueLabel.textColor = [UIColor darkTextColor]; 
     valueLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     valueLabel.backgroundColor = [UIColor clearColor]; 
     [cell.contentView addSubview: valueLabel]; 
    } 
    else 
    { 
     mainLabel = (UILabel*)[cell.contentView viewWithTag: MAINLABEL_TAG]; 
     valueLabel = (UILabel*)[cell.contentView viewWithTag: VALUELABEL_TAG]; 
    } 

    mainLabel.text = (NSString*)kCellTitles[indexPath.section][indexPath.row]; 
    valueLabel.text = [self tableView: tableView valueLabelTextForRowAtIndexPath: indexPath]; 

    return cell; 
} 
+0

Estoy descubriendo que este enfoque no es suficiente para mis necesidades.Tengo una celda que tiene un título de varias líneas y una descripción de varias líneas y se autoescribe en función del texto que contienen las dos etiquetas. Estoy dimensionando cosas en: (void) layoutSubviews y recordando llamar a [superdispositivoSubviews] primero, pero me parece que self.contentView aún no está redimensionando hasta después de esta llamada, y por lo tanto a veces mis celdas terminan en la altura incorrecta. – Johnus

+0

Este método es bueno, pero si quieres usar QuartzCore cosas como shadow para etiquetas, entonces el desplazamiento será lento, y tienes que dibujar tú mismo. – Alexander

+0

Desde entonces, he estado mucho más feliz con las subclases, ya que muchos de los problemas que tuve se corrigieron en SDK más recientes. Mi método actual implica una subclase con un método 'configureWithDataObject: (id) dataObject' que luego subclase para mis celdas personalizadas. Mi controlador de vista selecciona automáticamente la subclase de celda correcta y llama a 'configureWithDataObject:'. Hace que el desarrollo sea rápido y fácil (aunque técnicamente es menos eficiente que hacerlo todo en código estático). – jessecurry

9

Podría ser la respuesta tan simple como llamar primero [super layoutSubviews] dentro de su método de subclase UITableViewCelllayoutSubviews?

Aquí está mi código.

Primero crear el UITextField y añadirlo a la contentView en el initWithStyle: método:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     inputField = [[UITextField alloc] initWithFrame:CGRectZero]; 
     [self.contentView addSubview:inputField]; 
     inputField.borderStyle = UITextBorderStyleLine; 
     [inputField release]; 
    } 
    return self; 
} 

Luego, en layoutSubviews, tengo esto:

-(void)layoutSubviews 
{ 
    inputField.frame = CGRectMake(5, 5, 100, 20); 
} 

Con ese código, el texto campo es 5px desde la izquierda de la pantalla, que es, por supuesto, 5px a la izquierda de la celda de la tabla cuando está en modo agrupado. En otras palabras, FUERA de la celda de la vista de tabla. No es bueno.

Use este código y el inputField se coloca 5px a la derecha de la celda, como yo quiero que sea:

-(void)layoutSubviews 
{ 
    [super layoutSubviews]; // the magic line 
    inputField.frame = CGRectMake(5, 5, 100, 20); 
} 

pude haber entendido mal totalmente el problema que estaba teniendo, sin embargo!

Erik

+0

¡¿Cómo podría extrañar eso ?! ¡Muchas gracias por la línea mágica! – nonamelive

Cuestiones relacionadas