2011-02-09 15 views
8

Come si può espandere la seconda cella per adattarla al testo anziché ridimensionare il testo? C'è un modo integrato per farlo in iOS o dovrò escogitare qualche soluzione casalinga? Se guardi nell'applicazione Contatti iOS, c'è una casella come questa per Indirizzo. Non riesco a trovare come implementare questo però.Come posso creare una cella di tabella multilinea in iOS?

Table screenshot


per chi cerca di raggiungere questo obiettivo in futuro, ecco il codice per la mia soluzione:

file di intestazione: file di

#define FONT_SIZE 22.0f 
#define CELL_CONTENT_WIDTH 320.0f 
#define CELL_CONTENT_MARGIN 5.0f 

ATTUAZIONE:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (indexPath.section == 0 && indexPath.row == 1) { 

     NSString *text = [atmAnnotation address]; 

     CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

     CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 
     NSLog(@"Size for address is Height:%f Width:%f",size.height,size.width); 

     CGFloat height = MAX(size.height, 44.0f); 

     return height + (CELL_CONTENT_MARGIN * 2); 

    } 
    return 44.0f; 
} 

Ecco uno screenshot del risultato:

UITableView fixed

risposta

5

Sfortunatamente, dovrai implementare questa funzione da solo. Esistono numerosi metodi e callback da utilizzare per calcolare l'altezza delle righe e delle etichette. Se hai bisogno di aiuto per iniziare, posso modificare questa risposta per includere alcuni esempi di codice. Altrimenti, sono sicuro che ci sono alcune domande correlate qui su SO o Google che possono farti iniziare. In sintesi, comunque:

  • determinare l'altezza della riga nella UITableViewDelegate metodo -tableView:heightForRowAtIndexPath:. Probabilmente dovrai usare lo NSString UIKit Addition methods per calcolare quanto alta sarà la tua corda con una determinata dimensione del font, ecc. Restituire l'altezza corretta da questo metodo delegato.
  • Verificare che l'etichetta (in IB o configurata a livello di programmazione) sia impostata per utilizzare più righe. Se si imposta numberOfLines su 0, l'etichetta utilizzerà tutte le linee necessarie.
  • Nell'implementazione UITableViewDataSource di -tableView:cellForRowAtIndexPath:, è necessario utilizzare la stessa logica di prima per determinare la cornice delle etichette. Imposta il testo desiderato, quindi modifica la cornice in modo che l'etichetta sia abbastanza alta da adattarsi a malapena a tutto il testo.
1

implementare:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 

nella tabella delegato. Per la diversa riga e sezione nel percorso dell'indice passato, restituire un'altezza diversa per adattarla all'etichetta.

Verificare che "regolare per adattarsi" per l'etichetta in IB non sia spuntato (proprietà adjustsFontSizeToFitWidth se fatto utilizzando il codice).

1

Dove si ha l'indirizzo come etichetta di dettaglio, utilizzare un UILabel che supporta tutte le linee di cui si ha bisogno, per un indirizzo, 3 dovrebbe essere sufficiente. Insieme alla risposta Paul Bently's, dovresti essere a posto.

0

Mi sono imbattuto in questo stesso problema. Ho trovato una soluzione alternativa che non richiede abbastanza hardcoding e consente di apportare modifiche all'etichetta in Interface Builder che si rifletterà nel calcolo dell'altezza.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0 && indexPath.row == 1) { 
     NSString *text = [atmAnnotation address]; 
     UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

     cell.textLabel.text = text; 
     [cell.textLabel sizeToFit]; 

     CGFloat height = MAX(44, cell.textLabel.bounds.size.height); 

     return height + CELL_CONTENT_MARGIN * 2; 
    } 

    return 44.0f; 
} 

L'unico lato negativo è che questo causerà alcuni ulteriori assegnazioni UITableViewCell temporanei, ma la vista della tabella immediatamente li recuperare, quindi non credo che dovrebbe essere un grosso problema.

Problemi correlati