2010-10-25 7 views
28

La firma di questo metodo è:iPhone - il parametro di input per il metodo sizeThatFits di UIView

- (CGSize)sizeThatFits:(CGSize)size 

Non capisco quello che il parametro di dimensione viene utilizzato per. documentation di Apple afferma che è "La dimensione corrente del ricevitore".

Ma il ricevitore conosce presumibilmente la sua dimensione corrente. Quindi perché ha bisogno di essere passato?

Quando passo sperimentalmente altri valori, il metodo sembra utilizzare comunque le dimensioni correnti del ricevitore.

Qualcuno può spiegare? E c'è qualche caso in cui questo parametro conta?

risposta

26

Prima di tutto, questo metodo è legacy AppKit (non nel senso negativo della parola).

Sì, qualsiasi vista ha una dimensione corrente in un dato momento e può recuperarla dalla proprietà dei limiti. Ma ci sono situazioni complicate durante il layout quando la dimensione migliore dipende da fattori non abbastanza statici. Prendi un'etichetta di testo, per esempio. Può essere fluito in una o più righe e il numero di linee può dipendere dalla larghezza massima consentita. Quindi una possibile implementazione di UILabel potrebbe derivare le sue dimensioni dalla larghezza del CGSize passato a sizeThatFits: in tal caso quella dimensione non è letteralmente la dimensione corrente del ricevitore, ma qualche dimensione desiderata/limite.

Così una qualsiasi sottoclasse di UIView può implementare -sizeThatFits: come meglio crede (gioco di parole), ed è addirittura libero di ignorare il parametro size. Molto spesso quando devo implementare questo metodo, lo ignoro perché posso calcolarlo dallo stato interno della vista, ma in uno scenario più complesso potrebbe essere necessario utilizzare il parametro size per suggerire alcune restrizioni nel layout.

+1

In altre parole, la documentazione è errata quando si dice che l'argomento è la dimensione del destinatario ed è in realtà la dimensione che il genitore preferirebbe che il bambino utilizzasse? Ho sicuramente scritto il codice in questo modo, ma voglio confermare se è quello che intendi. –

+2

Una cosa è certa, l'implementazione predefinita di 'sizeToFit' chiama' sizeThatFits: ', passando' self.bounds.size'. – Costique

+0

Oh, non lo sapevo. Dal momento che non è documentato, ho definito saneSizeToFit su UIView tramite una categoria, che richiama sizeThatFits con una dimensione ben definita :) –

0

Non è solo la dimensione del ricevitore che è la dimensione della dimensione che si desidera riempire. Il risultato è quella dimensione che la vista crede mostrerà meglio i suoi contenuti per l'input dato size.

comportamento

Il default è di restituire semplicemente il size parametri (vale a dire la dimensione che si adatta la visualizzazione predefinita è la dimensione si dà) - quindi sì, questo parametro questioni per impostazione predefinita.

Le sottoclassi possono imporre vincoli come width==height o altre cose simili utilizzando questo metodo.

Problemi correlati