2014-10-28 9 views
6

Ho uno UILabel all'interno di uno UIScrollView che sto cercando di eseguire il wrap di parole. Voglio usare AutoLayout per la configurazione del layout. La parola UILabel si chiude perfettamente quando non si trova all'interno di uno UIScrollView. Devo solo impostare il numero di linee su 0 e impostare la modalità di interruzione di riga su A capo automatico.UILabel non eseguirà il wrap all'interno di UIScrollView con AutoLayout

Tuttavia, quando inserisco UILabel all'interno di UIScrollView, il ritorno a capo della parola non funziona più. Ho già controllato "Dynamic UILabel height inside UIScrollView with AutoLayout" e "Correctly Size UILabel inside UIScrollView using Interface Builder and Autolayout?", ma nessuna di queste domande ha risposte che mi aiutino.

Ho set up a test project che illustra esattamente di cosa sto parlando se qualcuno vuole dargli un'occhiata.

+0

In realtà le risposte alle domande che citi sono esattamente ciò di cui hai bisogno. Il problema è che non stai ascoltando quello che ti dicono. – matt

risposta

10

La ragione è che i vincoli all'interno di una vista di scorrimento, bloccati nella vista di scorrimento, non significano ciò che pensate che significano. Hanno a che fare con la determinazione dello contentSize della vista di scorrimento dall'interno verso l'esterno; non determinano da soli la dimensione delle cose all'interno della scrollview. Vedi la mia risposta: https://stackoverflow.com/a/13548039/341994

La soluzione più semplice nel tuo caso è utilizzare una vista di contenuto intermedio, in modo da avere questa gerarchia:

Ora dare il contenuto vista larghezza assoluta e vincoli di altezza e collegarlo su tutti e quattro i lati alla vista di scorrimento. Ora l'etichetta funzionerà come previsto. La vista del contenuto ha vincoli sufficienti sia per impostare la propria dimensione in modo assoluto sia per limitare la vista dello scorrimento di contentSize dall'interno. I vincoli sull'etichetta, nel frattempo, non si riferiscono alla vista di scorrimento ma alla vista del contenuto e, poiché la vista del contenuto ha una dimensione fissa ed è una vista normale (non una vista di scorrimento), i vincoli sull'etichetta fanno ciò che ci si aspetta .

+0

Se osservi attentamente il progetto che hai pubblicato, vedrai che Xcode ti sta effettivamente dicendo. C'è un avvertimento sulla struttura del layout della vista di scorrimento. Questo avvertimento ti sta effettivamente dicendo la stessa cosa che ti sto dicendo qui. Non ignorare gli avvisi di layout automatico in Xcode!Emettono qualcosa. – matt

+0

Grazie mille per la tua risposta, mi sta aiutando a capire cosa sta succedendo. Tuttavia, qual è questa "vista del contenuto" di cui stai parlando? Vista container? –

+0

È un semplice UIView di vaniglia il cui scopo è quello di fare ciò che ho appena descritto: agire come una vista intermedia in modo che il 'contentSize' sia impostato e i vincoli interni funzionino. – matt

6

ho avuto lo stesso problema, ma è stato in grado di ottenere l'UILabel per avvolgere correttamente impostando i seguenti vincoli sull'etichetta

  • Leading Spazio per Superview
  • spazio finale al Superview
  • Pari Width to Superview ** (Questo è quello che vincola la larghezza sull'etichetta in modo che si avvolga correttamente)

È inoltre necessario avere vincoli che portano dall'alto verso il basso om della vista di scorrimento. Ad esempio, se hai solo l'etichetta devi impostare Top Space e Bottom Space su Superview. Se non lo fai, avrà un'altezza del contenuto scorrevole controllabile.

Per impedire lo scorrimento orizzontale della vista a scorrimento, selezionare "Blocco direzione abilitato" e chiamare setContentOffset correttamente all'interno del metodo scrollViewDidScroll (vedere la prima risposta per la domanda this per i dettagli).

1

Provare a utilizzare UILabel'spreferredMaxLayoutWidth e impostarlo sulla larghezza della vista del genitore.