2014-11-29 17 views
5

Sto tentando di utilizzare UITableViewAutomaticDimension, ma sto riscontrando problemi nel far sì che una cella sia a larghezza completa e all'altezza corretta senza causare problemi NSLayoutAutomaticSizeConstraint.... Se spengo i vincoli della dimensione automatica sulla cella, non è a larghezza intera.UITableViewAutomaticPer i vincoli di rottura?

enter image description here

ho due pulsanti con vincoli orizzontali e verticali per la visualizzazione del contenuto. Hanno un vincolo di spaziatura verticale tra loro e ogni pulsante ha un vincolo di altezza.

Se spengo AutoResizingMask, ottengo una cella non piena. Se lo lascio, ottengo violazioni del vincolo del layout ma le cose vengono visualizzate correttamente.

Come posso ottenere il comportamento che sto cercando?

translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7f856b169650 V:[UIButton:0x7f856b16a510'+(null)'(50)]>", 
    "<NSLayoutConstraint:0x7f856b173dd0 UIButton:0x7f856b16a510'+(null)'.top == UITableViewCellContentView:0x7f856b16bfa0.topMargin>", 
    "<NSLayoutConstraint:0x7f856b173e70 UITableViewCellContentView:0x7f856b16bfa0.bottomMargin == UITextField:0x7f856b16c4f0.bottom>", 
    "<NSLayoutConstraint:0x7f856b174520 V:[UIButton:0x7f856b16a510'+(null)']-(8)-[UITextField:0x7f856b16c4f0]>", 
    "<NSLayoutConstraint:0x7f856b182a10 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f856b16bfa0(66)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f856b169650 V:[UIButton:0x7f856b16a510'+(null)'(50)]> 

Esso si presenta in realtà come la larghezza è impostata dal

- (CGSize)intrinsicContentSize { 
    return CGSizeMake(320, 66); 
} 

Se non metto una dimensione contenuto intrinseco, non ottengo alcuna larghezza o altezza.

+0

1) si sta creando i vostri vincoli e punti di vista in codice? 2) Nel navigatore della tua vista, ricevi un errore giallo o rosso? 3) che altro hai nella vista? – Spectravideo328

+0

Quali violazioni dei vincoli di layout stai ottenendo? – Lefteris

+0

@ Spectravideo328 Non ci sono errori gialli o rossi in IB, e tutti i vincoli sono in IB. –

risposta

2

edit: sua sicuramente i due vincoli di altezza. Prova a rimuovere una priorità o a ridurla.

+0

Ho impostato entrambi i vincoli di altezza su 999 anziché su 1000. Nessuna eccezione per l'autolayout. Non capisco ma funziona per me. –

+0

Con i vincoli attuali, si ha essenzialmente una cella ad altezza fissa. Pensaci in questo modo, se i tre vincoli di spaziatura verticale hanno un valore di 5 ciascuno, e le altezze dei pulsanti hanno un valore di 10 ciascuno, l'altezza è fissata a 35 (5 + 10 + 5 +10 +5). –

+0

Certo, e questo è il mio intento. Ma ho alcune celle ognuna con altezze diverse, e senza dimensione automatica questo significherebbe un mucchio di codice. Il distanziale inferiore potrebbe essere un "minimo", ma questa è l'unica stanza di manovra che voglio. –

1

AutoresizingMask on = consente ai genitori di questa vista di impostare le maschere appropriate.

AutoresizingMask off = Non consentire ai genitori di questa vista di impostare le maschere appropriate. Voglio farli da solo.

Se si creano viste in IB, i loro metodi di autoresizing sono impostati su No per impostazione predefinita.

Se si creano viste nel codice, i loro metodi di autoresizing sono impostati su Sì per impostazione predefinita.

Il fatto che si ottenga una cella non a larghezza intera (o qualsiasi cambiamento di comportamento) quando si spegne AutoresizingMask significa che probabilmente un genitore (nella gerarchia di viste) della cella o della tabella sta prendendo il sopravvento e imposta i vincoli (che non è quello che vuoi).

Ora il motivo per cui penso che questa cella non a larghezza intera sia dovuta a un fastidioso valore predefinito in IB quando si trascina tra gli elementi di visualizzazione per impostare i vincoli, dove invece di vincolare i vincoli in alto, in basso, ecc. ..; IB lo lega al margine (diverso).

Quindi è necessario selezionare i vincoli della "Struttura documento":

Document outline

E quindi selezionare uno per uno i vostri vincoli che legano al confine:

Constraint closed

E assicurarsi che "Relativo al margine" non sia selezionato.

Constraint open

Se si utilizza la scheda vincoli di sintesi in basso a destra della IB (secondo da sinistra), è possibile deselezionare il "vincolo di margini" durante la creazione dei vincoli:

Constraints summary

Constraints optn

+0

@StefanKendall come sopra, i vincoli superiore, destro e sinistro sono impostati su ContentView e non sul margine di contentView? – Spectravideo328

1

ho avuto un problema simile con questo:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

Mi ha gettato un registro di "in grado di soddisfare i vincoli", ma non c'era alcun vincolo indurre in errore così ho aggiunto l'estimatedHeightForRowAtIndexPath:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

ed è fissato

Problemi correlati