Stai riscontrando l'effetto collaterale di una fantastica nuova funzionalità nelle visualizzazioni da tavolo di iOS8: Automatic Row Heights.
In iOS 7, avevi righe di dimensioni fisse (impostate con tableView.rowHeight
) oppure avresti scritto il codice per calcolare l'altezza delle celle e lo avresti restituito in tableView:heightForRowAtIndexPath
. Scrivere codice per il calcolo dell'altezza di una cella potrebbe essere piuttosto complesso se avessi numerose viste nella tua cella e avessi diverse altezze da considerare con diverse dimensioni dei caratteri. Aggiungi Dynamic Type e il processo è stato un rompicoglioni.
In iOS 8, puoi ancora fare quanto sopra, ma ora l'altezza delle righe può essere determinata da iOS, a condizione che tu abbia configurato il contenuto della tua cella utilizzando il layout automatico. Questo è un enorme vantaggio per gli sviluppatori, perché quando la dimensione del carattere dinamico cambia o l'utente modifica la dimensione del testo utilizzando le Impostazioni di accessibilità, la tua interfaccia utente può essere adattata alla nuova dimensione. Significa anche che se hai un'etichetta UIL che può avere più righe di testo, la tua cella può ora crescere per adattarsi a quelle quando le celle ne hanno bisogno e ridursi quando non lo fa, quindi non ci sono spazi bianchi non necessari.
Il messaggio di avviso che stai vedendo ti sta dicendo che non ci sono abbastanza vincoli nella tua cella per il layout automatico per informare la tableview dell'altezza della cella.
Per utilizzare l'altezza della cella dinamica, che, insieme alle tecniche già menzionate da altri poster, eliminerà anche questo messaggio, è necessario assicurarsi che la cella abbia vincoli sufficienti per associare gli elementi dell'interfaccia utente alla parte superiore e inferiore della cella. Se in precedenza hai utilizzato il layout automatico, probabilmente sei abituato a impostare i vincoli Top + Leading, ma anche l'altezza della riga dinamica richiede vincoli in basso.
Il passaggio di layout funziona in questo modo, che si verifica immediatamente prima che una cella venga visualizzata sullo schermo, in modo just-in-time:
Vengono calcolate le dimensioni per il contenuto con dimensioni intrinseche. Ciò include UILabels e UIImageViews, dove le loro dimensioni si basano sul testo o sulle UIImages che contengono, rispettivamente. Entrambe queste viste considereranno la loro larghezza come nota (perché hai impostato vincoli per i bordi di uscita / di entrata, o hai impostato larghezze esplicite, o hai usato vincoli orizzontali che alla fine rivelano una larghezza da un lato all'altro). Supponiamo che un'etichetta abbia un paragrafo di testo ("numero di righe" è impostato su 0 in modo che venga a capo automatico), può essere solo di 310 punti, quindi è determinato ad essere alto 120pt con la dimensione del carattere corrente.
L'interfaccia utente è strutturata in base ai vincoli di posizionamento. C'è un vincolo nella parte inferiore dell'etichetta che si collega al margine inferiore della cella. Poiché l'etichetta è cresciuta fino a raggiungere un'altezza di 120 punti e poiché è vincolata alla parte inferiore della cella dal vincolo, deve spingere la cella "verso il basso" (aumentando l'altezza della cella) per soddisfare il vincolo che dice "fondo di l'etichetta è sempre a distanza standard dal fondo della cella.
Il messaggio di errore che hai segnalato si verifica se manca quel vincolo di fondo, nel qual caso non c'è nulla per "spingere" il fondo della cella lontano dalla parte superiore della cella, che è l'ambiguità segnalata: senza nulla da cui spingere il fondo in alto, la cella crolla. Ma Layout automatico rileva anche questo e ricorre all'altezza della riga standard.
Per quello che vale, e soprattutto per avere una risposta arrotondata, se implementi le altezze delle righe dinamiche basate sul layout automatico di iOS 8, dovresti implementarle tableView:estimatedHeightForRowAtIndexPath:
. Questo metodo di stima può utilizzare valori approssimativi per le celle e verrà chiamato quando viene inizialmente caricata la visualizzazione tabella. Aiuta UIKit a disegnare cose come la barra di scorrimento, che non può essere disegnata a meno che la tableview non sappia quanto contenuto può scorrere, ma non ha bisogno di dimensioni totalmente accurate, poiché è solo una barra di scorrimento. Ciò consente di posticipare il calcolo dell'altezza effettiva della riga fino al momento in cui è necessaria la cella, il che è meno impegnativo dal punto di vista computazionale e consente di presentare più rapidamente UITableView.