2015-11-21 5 views
5

Sto cercando di capire come funziona davvero la resistenza di compressione e compressione.resistenza di compressione e compressione nelle viste nidificate

Ho questo scenario in cui ho bisogno di due etichette a sinistra (all'interno del contenitore verde) e due etichette a destra (all'interno del contenitore blu).

enter image description here

Come mostra l'immagine, voglio il contenitore verde per abbracciare contenuti (Android di wrap content) ed il contenitore blu per riempire lo spazio rimanente (di Android fill_parent).

ho pensato che avrei potuto aggiungere appena priorità abbracciare/compressione alla vista verde, come:

greenView.setContentHuggingPriority(
    UILayoutPriorityDefaultHigh, forAxis: .Horizontal) 
greenView.setContentCompressionResistancePriority(
    UILayoutPriorityDefaultHigh, forAxis: .Horizontal) 

ma sembra che non funziona come previsto. Devo applicare questi vincoli alle etichette (rosse e gialle).

Qualcuno conosce il motivo?

Alcuni pensieri (a cura):

Dalla risposta di Ken ne consegue che si deve impostare abbracciare/compressione per le etichette al posto delle vedute contenitore.

Nell'esempio di questa domanda, imposterei, ad esempio, un abbraccio di 750 (Alto) e una resistenza di 1000 (Richiesto) alle etichette a sinistra. Poiché le impostazioni predefinite per le etichette si allungano di 251 (minimo + 1) e di 750 (alta), l'abbraccio e la compressione saranno maggiori per le etichette a sinistra (750> 251 e 1000> 750). Allo stesso tempo, la compressione sarà maggiore dell'abbraccio all'interno delle etichette stesse (1000> 750).

In questo modo, le etichette a sinistra cercheranno di abbracciare il loro contenuto, ma non tanto quanto comprimerlo. Ad esempio, l'etichetta rossa non può avvolgere completamente il suo contenuto perché l'etichetta gialla non si vuole comprimere.

Phew!

risposta

13

Le priorità di contenimento e compressione della compressione hanno un significato solo in relazione alla dimensione intrinseca del contenuto della vista. In sostanza, se una vista ha una larghezza contenuto intrinseco, allora il sistema di layout automatico tratta come se fosse soggetta ai seguenti vincoli:

[view(<[email protected])] 
[view(>[email protected])] 

Questo è tutto quelli media. Lo stesso vale per l'altezza intrinseca, ovviamente.

Un piano UIView utilizzato come contenitore non ha dimensioni intrinseche. Quindi, le sue priorità di abbraccio e di resistenza alla compressione non hanno senso.

+0

Grande spiegazione, Ken. Non ho visto spiegazioni del genere da nessuna parte, e ha perfettamente senso. C'è qualche documento ufficiale dove questo è confermato? –

+0

Ora vedo che questo è ciò che la [documentazione ufficiale] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/setContentHuggingPriority:forAxis :) dice. Ma ora lo capisco. Grazie! –

+1

Sono felice di poterti aiutare. Piuttosto che consultare il riferimento alla classe, potresti trovare la [guida concettuale] (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AnatomyofaConstraint.html#//apple_ref/doc/uid/ TP40010853-CH9-SW21) più utile. –