2012-05-25 16 views
8

Tengo una UITableView cargando una UITableViewCell personalizada desde un archivo XIB. Todo está funcionando bien, pero mi diseño requiere que las celdas (todas dentro de una sola sección) tengan espacio entre ellas. ¿Hay alguna posibilidad de que esto se pueda hacer sin tener que elevar la altura de la FILA?Espaciado entre celdas en UITableView con UITableViewCell personalizado

cómo es ahora
how it is now

cómo se supossed ser
how it's supossed to be

EDIT:
así es como el código es hoy

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [[self.cards valueForKeyPath:@"cards"] count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    [ccTableView setBackgroundColor:[UIColor clearColor]]; 
    cardsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardsCell"]; 

    if(cell == nil){ 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cardsCell" owner:self options:nil]; 
     cell = [topLevelObjects objectAtIndex:0]; 
    } 

    NSString *nmCard = [[self.cards valueForKeyPath:@"cards.name"] objectAtIndex:indexPath.row]; 
    cell.descCardLabel.text = nmCard; 

    return cell; 
} 
+0

¿Por qué no quiere aumentar la altura de la fila? –

+0

@obuseme en el caso más simple hay un estado xib y tres filas (centro, arriba, abajo), el código estará bastante enredado. –

+0

@obuseme Además, mi celda tiene una imagen de fondo con una altura de 35 donde está la etiqueta. Si elevo la altura de la fila, el diseño será como yo quiera, pero la selección de tocar funcionará debajo de la imagen, en el espaciado, y no quiero selecciones de alteraciones de la fila incorrecta. – gmogames

Respuesta

7

Si es posible no cambia la altura de la celda, La solución es usar células intermedias invisibles de la altura requerida. Deberá volver a calcular los índices en el delegado y el origen de datos de la vista de tabla en ese caso.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    static NSString *CELL_ID2 = @"SOME_STUPID_ID2"; 
    // even rows will be invisible 
    if (indexPath.row % 2 == 1) 
    { 
     UITableViewCell * cell2 = [tableView dequeueReusableCellWithIdentifier:CELL_ID2]; 

     if (cell2 == nil) 
     { 
      cell2 = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
              reuseIdentifier:CELL_ID2]; 
      [cell2.contentView setAlpha:0]; 
      [cell2 setUserInteractionEnabled:NO]; // prevent selection and other stuff 
     } 
     return cell2; 
    } 

    [ccTableView setBackgroundColor:[UIColor clearColor]]; 
    cardsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardsCell"]; 

    if(cell == nil){ 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cardsCell" owner:self options:nil]; 
     cell = [topLevelObjects objectAtIndex:0]; 
    } 

    // Use indexPath.row/2 instead of indexPath.row for the visible section to get the correct datasource index (number of rows is increased to add the invisible rows) 
     NSString *nmCard = [[self.cards valueForKeyPath:@"cards.name"] objectAtIndex:(indexPath.row/2)]; 
     cell.descCardLabel.text = nmCard; 

     return cell; 
    } 



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 

    // two times minus one (invisible at even rows => visibleCount == invisibleCount+1) 
    return [[self.cards valueForKeyPath:@"cards"] count] * 2 - 1; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row % 2 == 1) 
     return 40; 
    return 162; 
} 

También tendrá que volver a calcular la indexPath.row para :didSelectRowAtIndexPath: y otros métodos donde se utiliza.

+0

¿Alguna posibilidad de un ejemplo de código sobre cómo lograr esto? Agregué mi código actual a la pregunta. Gracias. – gmogames

+0

@Guilherme Mogames ver la actualización –

+1

En realidad, este único código hizo todas las filas pares en blanco. Por ejemplo, la primera fila (celda 1) devuelve 0, por lo que en lugar de devolver la celda con el texto, devuelve la celda2 en blanco. entonces obtengo 2 artículos en la mesa pero el 1er está en blanco. – gmogames

4

Aunque @ A-Live es técnicamente correcto, con el fin de evitar que otras cuestiones, por ejemplo: se olvida de poner un indexPath.row/2 en algún lugar, puede hacer lo siguiente (que no implica programación):

Digamos, por ejemplo, que su altura de UITableViewCell normalmente es de 90 puntos y desea un espacio de 10 puntos entre cada celda. Haga su UITableViewCell 100 puntos alto y simplemente haga que los 10 puntos inferiores de UITableViewCell estén en blanco (sin objetos de ningún tipo). A continuación, haga clic en UITableViewCell en el constructor de interfaz y configure backgroundColor en el color que desee del área de separación.

Voila! ¡Tienes espacio entre cada celda con un poco de trabajo que es mucho más fácil que programar/2 en todas partes!

+0

¿cómo hago el 10 inferior con nada? Acabo de establecer el fondo de la celda en blanco – Dejell

36

En realidad, encontré una solución bastante fácil si usa clases personalizadas de uitableviewcell.

En la clase de células, agregue este código:.

- (void)setFrame:(CGRect)frame { 
    frame.origin.y += 4; 
    frame.size.height -= 2 * 4; 
    [super setFrame:frame]; 
} 

esto le dará un buffer de 4 puntos en la altura de la celda que puso en la clase uitablview se llama a esta célula en Obviamente, ahora tiene que Compense ese menor espacio en la celda cuando coloque etiquetas e imágenes, pero funciona. También puede hacer lo mismo en el eje x para reducir el ancho de la celda. He hecho esto en mi aplicación para mostrar imágenes de fondo detrás de mis celdas.

+0

Cool! ¡funciona a la perfección de lo que esperaba! –

+0

¡Voto genial para esta solución. – lee

+0

Gracias eso es lo que estoy buscando :) – Harshad

0

Si está buscando una solución en swift, esta respuesta de reddit funcionó perfectamente para mí.

class CustomTableViewCell: UITableViewCell { 
override var frame: CGRect { 
    get { 
     return super.frame 
    } 
    set (newFrame) { 
     var frame = newFrame 
     frame.origin.y += 4 
     frame.size.height -= 2 * 4 
     super.frame = frame 
    } 
} 
} 
Cuestiones relacionadas