2012-05-25 15 views
8

Ho un UITableView che carica un UITableViewCell personalizzato da un file XIB. Tutto funziona bene, ma il mio layout richiede che le celle (tutte all'interno di una singola sezione) abbiano una spaziatura tra di esse. Qualche possibilità si può fare senza dover alzare l'altezza della RIGA?Spaziatura tra celle su UITableView con UITableViewCell personalizzato

come è ora
how it is now

come è supossed essere
how it's supossed to be

EDIT:
questo è come il codice è oggi

- (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

Perché non si desidera aumentare l'altezza della riga? –

+0

@obuseme nel caso più semplice c'è uno xib e tre stati di riga (medio, alto, basso), il codice sarà abbastanza complicato. –

+0

@obuseme Inoltre, la mia cella ha un'immagine di sfondo con 35 altezza dove si trova l'etichetta. Se alzo l'altezza della riga, il layout sarà come voglio, ma la selezione toccando funzionerà sotto l'immagine, sulla spaziatura, e non voglio selezioni accidentali della riga sbagliata. – gmogames

risposta

7

Se è possibile cambiare l'altezza della cella, il la soluzione consiste nell'utilizzare celle intermedie invisibili dell'altezza richiesta. In tal caso sarà necessario ricalcolare gli indici in base alla vista tabella delegato e origine dati.

- (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; 
} 

Sarà inoltre necessario ricalcolare l'indexPath.row per :didSelectRowAtIndexPath: e altri metodi in cui viene utilizzato.

+0

c'è qualche possibilità per un esempio di codice su come ottenere ciò? Ho aggiunto il mio codice attuale alla domanda. Grazie. – gmogames

+0

@Guilherme Mogames vedere l'aggiornamento –

+1

In realtà, questo solo codice ha reso vuote tutte le righe pari. Ad esempio, la prima riga (cella 1) restituisce 0, quindi invece di restituire la cella con il testo, restituisce la cella2 vuota. quindi ottengo 2 elementi nel tavolo ma il primo è vuoto. – gmogames

4

Sebbene @ A-Live è tecnicamente corretta, al fine di evitare altri problemi, es: si dimentica di mettere un indexPath.row/2 da qualche parte, è possibile effettuare le seguenti operazioni (che comporta alcuna programmazione):

Ad esempio, l'altezza di UITableViewCell è normalmente di 90 punti e si desidera una spaziatura di 10 punti tra ogni cella. Rendi il tuo UITableViewCell 100 punti alto e rendi vuoti i 10 punti in basso di UITableViewCell (nessun oggetto di alcun tipo). Quindi fai clic su UITableViewCell nel generatore di interfacce e imposta il backgroundColor su qualsiasi cosa desideri che sia il colore dell'area di spaziatura.

Voilà! Hai spaziatura tra ogni cella con un po 'di lavoro che è molto più facile di programmazione/2 in tutto il mondo!

+0

come faccio a rendere il fondo 10 con niente? Ho appena impostato lo sfondo della cella sul bianco – Dejell

36

In realtà c'è una soluzione piuttosto semplice che ho trovato, se si utilizzano classi personalizzate uitableviewcell.

Nella classe di cellule, aggiungere questo codice:.

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

questo vi darà un buffer 4pt entro l'altezza della cella si inserisce nella classe uitablview si sta chiamando questa cella nel Ovviamente, ora avete a compensare quel minor spazio nella cella quando si inseriscono etichette e immagini, ma funziona. Puoi anche fare la stessa cosa sull'asse x per ridurre la larghezza della cella. Ho fatto questo nella mia app per mostrare le immagini di sfondo dietro le mie cellule.

+0

Cool! funziona perfettamente di quanto mi aspettassi! –

+0

Cool up voto per questa soluzione. – lee

+0

Grazie, questa è la cosa che sto cercando :) – Harshad

0

Se stai cercando una soluzione in modo rapido, questa risposta da reddit ha funzionato perfettamente per me.

Problemi correlati