Prima di tutto, non si ha realmente bisogno di una vista stack per questo? Sarebbe molto più facile organizzare questo semplicemente usando direttamente i vincoli di altezza proporzionale.
Tuttavia, è possibile eseguire con una vista stack se si desidera utilizzare una vista stack. Il segreto è che il "peso" in questione è semplicemente la vista combinata intrinsicContentSize().height
. Sapendo questo, sono stato facilmente in grado di impostare una visualizzazione pila composta da tre punti di vista di immagine nelle proporzioni si richiede:

Quelli, ai fini della manifestazione, sono la stessa immagine ripetuto tre volte : uno a 3x di altezza, uno a 6x di altezza e uno a 1x altezza.
Come l'ho fatto? Ho dato alle tre immagini i valori tag
rispettivamente di 300, 600 e 100 nello storyboard. (. Naturalmente ho potuto usare una proprietà personalizzata IBInspectable per questo, e nella vita reale, lo farei) Poi ho fatto loro tutte le istanze della mia sottoclasse UIImageView, MyImageView, il cui codice assomiglia a questo:
class MyImageView: UIImageView {
override func intrinsicContentSize() -> CGSize {
print(self.tag)
return CGSizeMake(CGFloat(self.tag), CGFloat(self.tag))
}
}
La distribuzione dello stack view è configurata come Fill proporzionale. Le visualizzazioni di immagine sono configurate con il loro Modo Contenuto come Scala da riempire. Risultato: la vista pila, nel disporre le viste disposte, consulta il metodo intrinsicContentSize
e quindi fa la cosa giusta.
"UIStackView non hai un concetto di pesi" In realtà, sì lo fa. Ma il peso è una qualità intrinseca della vista organizzata. – matt
non possiamo impostare la proprietà ['distribution'] (https://developer.apple.com/documentation/uikit/uistackviewdistribution) di stackview a [' fillProportionally'] (https://developer.apple.com/documentation/ uikit/uistackviewdistribution/1616217-fillproportionally) –
Se si utilizza 'fillProportionally', è necessario impostare 'intrinsicContentSize' di ogni vista sul peso desiderato. Poiché 'intrinsicContentSize' è una proprietà' readonly', ciò significa creare sottoclassi 'UIView' per sovrascrivere' intrinsicContentSize'. Se si utilizzano i vincoli, non è necessario creare sottoclassi. –