2011-02-03 34 views
28

Devo creare un UITableViewCell che contenga un sacco di testo. So che posso aggiungere uno UITextView alla mia cella, ma ciascuna voce non avrà la stessa quantità di testo.UITableViewCell, UITextView con altezza dinamica

So che posso controllare l'altezza del UITableViewCell con: -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath, ma questo non è proprio quello che sto cercando.

Scenario 1:

--------------- 
| First Cell | 
--------------- 
--------------- 
| Second Cell | 
| with some  | 
| text.   | 
--------------- 
--------------- 
| Third Cell | 
--------------- 

Scenario 2:

--------------- 
| First Cell | 
--------------- 
--------------- 
| Second Cell | 
| with some  | 
| more text and | 
| an unknown | 
| cell height. | 
--------------- 
--------------- 
| Third Cell | 
--------------- 
+0

non è chiaro cosa si sta cercando, - (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath è il metodo standard per farlo. –

+4

Sì, ma quando non si conosce l'altezza della cella in anticipo, non ha senso. – WrightsCS

risposta

34

Uso UILabel per il testo delle cellule. È quindi possibile utilizzare sizeWithFont:constrainedToSize: per calcolare l'altezza di tale etichetta UIL all'interno di ciascuna cella. Per esempio:

#define PADDING 10.0f 

- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *text = [self.items objectAtIndex:indexPath.row]; 
    CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)]; 

    return textSize.height + PADDING * 3; 
} 
+2

Come per lo stesso UILabel, usare 'sizeWithFont: constrainedToSize:' per calcolare preventivamente la dimensione richiesta e renderla con 'drawInRect: withFont:' –

+0

Che tipo di wrapping ha sizeWithFont: constrainedToSize: assumere? – Bogatyr

+0

+1 grazie, ho un'etichetta dinamica in una cella di tabella e questo ha funzionato perfettamente! Ho anche dovuto impostare il frame dell'etichetta in cellForRowAtIndexPath per il calcolo textSize. – Bogatyr

2

È roba piuttosto complicato, in quanto comporta cose come il contentInset di lui vista testo che si dovrà prendere in considerazione nel calcolo delle dimensioni testi. Ho scritto le mie conoscenze e la soluzione per il calcolo del UITableViewCell height based on an inner UITextView sul mio blog. Il post contiene il codice che funziona per le app universali, sia per gli stili di visualizzazione tabella che per la rotazione automatica.

2

La soluzione è abbastanza semplice e dovrebbe funzionare in quanto iOS 7. Assicurarsi che l'opzione viene attivata Scrolling Enabledfuori per la UITextView all'interno del UITableViewCell nello Storyboard.

Poi, nel viewDidLoad del UITableViewController() impostare l'tableView.rowHeight = UITableViewAutomaticDimension e tableView.estimatedRowHeight > 0 quali:

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 44.0 
} 

Questo è tutto. L'altezza di UITableViewCell verrà regolata automaticamente in base all'altezza interna dello UITextView.

Problemi correlati