2013-09-27 13 views
10

Sto cercando di creare una vista contenitore personalizzata che abbia UIImageView e una UILabel multilinea come subviews. Per far funzionare bene con vista autolayout, sono sovrascrivendo intrinsicContentSize come di seguito:UIView con altezza dinamica che utilizza intrinsicContentSize

- (CGSize)intrinsicContentSize 
{ 
    return [self sizeThatFits:self.bounds.size]; 
} 

La dimensione calcolato sizeThatFits ha la stessa larghezza, e regola l'altezza in modo che l'etichetta e l'immagine non sono tagliati. Questo metodo funziona bene, ma sono rimasto sorpreso di vedere nella documentazione il seguente commento:

Questa dimensione intrinseca deve essere indipendente dal frame del contenuto, perché non c'è modo di comunicare in modo dinamico una larghezza modificato al sistema di layout in base a un'altezza modificata, ad esempio.

In tal caso, qual è il metodo di passaggio automatico per regolare l'altezza corrente delle viste in base alla larghezza e al contenuto? Dovrei avvicinarmi a questo in un modo diverso?

+0

Se si desidera evitare che il contenuto venga ritagliato, è la priorità di resistenza alla compressione della vista del contenitore che deve essere aumentata. –

+1

La resistenza alla compressione è la priorità alla quale una vista resiste a essere ridotta rispetto alla sua dimensione intrinseca del contenuto. Se la dimensione del contenuto intrinseco non è corretta, questo non sarà di grande utilità. – Tark

risposta

4

Per rispondere alla mia domanda, sembra che non ci sia una soluzione adatta a questa situazione. Guardando a UILabel per ispirazione, il problema qui è stato risolto con l'aggiunta di una proprietà preferredMaxLayoutWidth, che può quindi essere utilizzata come larghezza di restrizione durante il calcolo della dimensione del contenuto intrinseco. Qualsiasi visualizzazione personalizzata dovrebbe utilizzare qualcosa di simile.

+0

Sì, sembra che non ci sia quasi nessun aiuto da parte di Autolayout per realizzarlo. La tua risposta mi ha fatto pensare l'approccio in cui abbiamo vincolo di larghezza vista quando 'preferredMaxLayoutWidth> 0.0f', e letteralmente non vincolo altrimenti - uso un grande galleggiante (per esempio 99999.0f) per una larghezza di calcolo delle dimensioni contenuto intrinseco. –

1

Penso che il documento significhi che, il tuo containerView potrebbe avere un placeHolderFrame come frame del contenuto.

La dimensione intrinseca non deve essere correlata al frame del contenuto, ma solo al proprio contenuto secondario. La tua immagine e UILabel per esempio.

È necessario calcolare sia l'altezza che la larghezza dall'etichetta e dall'immagine. Quale dovrebbe essere facile, dal momento che tutti hanno dimensioni intrinseche.

Solo la mia opinione ...

+3

Che cos'è placeHolderFrame? Del resto, cos'è una cornice di contenuti? L'etichetta è un'etichetta multilinea, non è possibile sapere quale sarà la sua altezza senza prima sapere quanta larghezza della vista debba racchiudere il testo. – Tark

0

Credo che si potrebbe utilizzare le nuove preferredMaxLayoutWidth proprietà di UILabel all'etichetta di layout in modo corretto e utilizzare altri approcci al layout altre cose.

Qualcosa di simile:

- (void)layoutSubviews 
{ 
    ... 
    [super layoutSubviews]; // get width from solved constraints 
    label.preferredMaxLayoutWidth = label.frame.size.width; // use it 
    [super layoutSubviews]; // update height of a label (probably intrinsicContentSize) 
    ... 
} 
+0

Il problema qui non è come strutturare correttamente la vista, è dire al sistema di layout l'altezza intrinseca della vista, in modo che sia data l'altezza corretta in base al suo contenuto. – Tark

+0

Il mio punto è sul contenuto intrinseco. Dimensione di un'etichetta.Con preferredMaxLayoutWidth può essere aggiornato in modo più intuitivo (forse è così che Apple suggerisce di fare cose). –

Problemi correlati