2013-05-21 7 views
5

Ho una vista tabella con un mucchio di celle (cella personalizzata, che ha solo la sua vista del contenuto).Layout automatico iOS: altezza dinamica per cella vista tabella

In tableView:cellForRowAtIndexPath: Sto aggiungendo un UIView predefinito (che ha diverse subviews) alla vista del contenuto della cella personalizzata. Ho impostato tutti i vincoli per l'UIView e le sue sottoview prima.

Ultimo ma non meno importante, ho impostato i vincoli verticale e orizzontale per la visualizzazione del contenuto della mia cella personalizzata (superview) e di UIView, che è stata aggiunta prima (sottoview).

Le stringhe di vincolo simile a questa:

H:|[view]| 
    V:|[view]| 

Purtroppo, ho ancora ottenere l'altezza di default per tutte le celle vista tabella. Mi chiedo se c'è un modo per consentire al layout automatico di eseguire automaticamente il calcolo dell'altezza in base alla dimensione del contenuto.

+1

No. È necessario implementare 'tableView: heightForRowAtIndexPath' e ritorno sarà utilizzato un altezza o l'altezza di default della cella. –

+0

C'è un modo per lasciare che la vista decida quale altezza dovrebbe avere? – Chrizzor

+1

Se usi 'UITableViewCells' personalizzati, puoi creare un metodo nella sottoclasse che restituisce l'altezza per quella cella e quindi chiamare quel metodo in' tableView: heightForRowAtIndexPath'. Ovviamente, cerca di rendere il calcolo veloce ed efficiente (possibilmente pre-calcolare il risultato su ogni cambiamento e memorizzare il risultato in caso di calcolo molto complesso). –

risposta

0

Ho risolto il problema utilizzando CGSize size = [view systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; in tableView:heightForRowAtIndexPath:.

1

Layout automatico non aiuta con l'altezza della cella. Dovrai impostarlo in tableView:heightForRowAtIndexPath. Immagino che probabilmente lo stai chiedendo perché le altezze delle tue celle sono variabili, non fisse. cioè, dipendono dal contenuto.

Per risolvere che, pre-calcolare le altezze delle celle e memorizzarli in un array. Restituire il valore per l'appropriato indexPath nel metodo tableView:heightForRowAtIndexPath.

Assicurarsi di calcolare le dimensioni del contenuto sul thread principale, utilizzando sizeThatFits delle classi UILabel e simili.

Se il calcolo è intenso, non utilizzare la maggior parte di esso su main separatamente dai metodi relativi alla vista, ad esempio sizeThatFits.

4

Partenza mia risposta dettagliata a questa domanda qui: https://stackoverflow.com/a/18746930/796419

Ci vuole un po 'di lavoro da impostare, ma si può assolutamente avere vincoli di layout automatico guida di una visualizzazione della tabella completamente dinamico senza una sola altezza hardcoded (e lasciare che il risolutore di vincoli esegua il sollevamento pesante e fornisca l'altezza della fila).

0

Per impostare le quote automatiche per l'altezza della riga, verificare le seguenti operazioni da eseguire, la quota automatica è efficace per il layout di altezza cella/riga.

  • Assign e attuare dataSource e delegare
  • Assign UITableViewAutomaticDimension a rowHeight & estimatedRowHeight
  • Implementare delegato/metodi dataSource (cioèheightForRowAt e restituire un valore UITableViewAutomaticDimension ad esso)

-

@IBOutlet weak var table: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Don't forget to set dataSource and delegate for table 
    table.dataSource = self 
    table.delegate = self 

    // Set automatic dimensions for row height 
    table.rowHeight = UITableViewAutomaticDimension 
    table.estimatedRowHeight = UITableViewAutomaticDimension 
} 



// UITableViewAutomaticDimension calculates height of label contents/text 
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

Per esempio un'etichetta UITableViewCell

  • numero Insieme di linee = 0 (modalità di interruzione & linea = troncare coda)
  • Imposta tutti i vincoli (in alto, in basso, a destra a sinistra) rispetto al suo contenitore superview/cella.
  • Opzionale: Imposta l'altezza minima per l'etichetta, se si desidera un'area verticale minima coperta dall'etichetta, anche se non ci sono dati.

enter image description here