2016-03-29 10 views
21

SfondoCome impostare la dimensione del contenuto intrinseco di una vista personalizzata in Swift?

sto facendo un'etichetta verticale da utilizzare con lo script tradizionale mongola. Prima stavo semplicemente ruotando un UILabel ma c'erano alcuni problemi di prestazioni e altre complicazioni con questo. Ora sto lavorando per creare un'etichetta da zero. Tuttavia, ho bisogno dell'etichetta verticale per dire al layout automatico quando la sua altezza si regola (in base alla lunghezza della corda).

quello che ho letto

Ho letto la documentazione Intrinsic Content Size e Views with Intrinsic Content Size. Questi erano più su come usarlo, comunque, e non su come definirlo in una vista personalizzata.

Ricerca di "dimensioni contenuto intrinseco IOS per una visualizzazione personalizzata" mi dà solo

in overflow dello stack. Questa particolare domanda non aveva nemmeno bisogno di dimensioni intrinseche del contenuto perché la loro vista era solo un insieme di viste standard.

Quello che sto cercando

Quello che sto cercando è la mia risposta qui sotto. Sto aggiungendo questo Q & Una coppia in modo che non ci vorrà altre persone il tempo per trovare la risposta in quanto mi ha portato con le parole chiave di ricerca che ho usato.

risposta

53

L'impostazione della dimensione del contenuto intrinseco di una vista personalizzata consente al layout automatico di sapere quanto grande dovrà essere quella vista. Per impostarlo, è necessario eseguire l'override di intrinsicContentSize.

override var intrinsicContentSize: CGSize { 
    return CGSize(width: x, height: y) 
} 

quindi chiamare

invalidateIntrinsicContentSize() 

Ogni volta che devono essere aggiornati intrinseche cambia la dimensione del contenuto del la visualizzazione personalizzata e il telaio.

Note

+1

Swift 3: http://stackoverflow.com/a/38881383/1161948 – ThisClark

3

Sulla base della risposta eccellente sopra,

esempio di una "vista con altezza intrinseca" ...

@IBDesignable 
class HView: UIView { 
    @IBInspectable var height: CGFloat = 100.0 
    override var intrinsicContentSize: CGSize { 
     return CGSize(width: 99, height: height) 
     // if using in, say, a vertical stack view, the width is ignored 
    } 
} 

enter image description here

quale è possibile impostare come ispezionabile

enter image description here

Poiché ha un'altezza intrinseca, può (per esempio) immediatamente inserito in una vista in pila codice:

stack?.insertArrangedSubview(HView(), at: 3) 

Al contrario, se fosse una vista normale senza altezza intrinseca, si avrebbe per aggiungere un ancoraggio altezza o si potrebbe andare in crash:

let v:UIView = HView() 
v.heightAnchor.constraint(equalToConstant: 100).isActive = true 
stack?.insertArrangedSubview(v, at: 3) 

Nel caso particolare di una vista pila, si deve solo preoccuparsi di un solo ancoraggio (per la vista pila verticale, l'altezza) in modo da impostare i lavori in altezza intrinseche perfettamente; poiché l'altezza intrinseca in effetti significa che l'ancoraggio di altezza in modo specifico verrà impostato automaticamente se necessario. (Ricordando che in tutti i casi normali di una sottoview sono necessari molti altri ancoraggi.)

Problemi correlati