Cornice, limiti, centro, origine di UIView, quando usare cosa?


195

UIViewha le proprietà frame, bounds, center, e origin, e tutti sembrano essere correlati. Il più delle volte, mi occupo di frameimpostare la posizione e le dimensioni di a UIView. Capisco che framesta usando il sistema di coordinate globale e boundssta usando le coordinate della vista locale (quindi le sue xey sono 0, ma non sempre), ma mi confonde ancora quando usare cosa.

In quale contesto (e qual è il momento giusto) le altre proprietà ( bounds, center, origin) deve essere utilizzato?


Il link qui sotto ha la risposta migliore. stackoverflow.com/questions/5361369/...
ohmy

Telaio vs Bounds con le foto: stackoverflow.com/a/28917673/3681880
Suragch

Risposte:


240

La risposta di Marco sopra è corretta, ma solo per espandere la questione di "in quale contesto" ...

frame : questa è la proprietà che usi più spesso per le normali applicazioni iPhone. la maggior parte dei controlli verrà disposta in relazione al controllo "contenendo" in modo che frame.origin corrisponda direttamente a dove deve essere visualizzato il controllo, e frame.size determinerà quanto sarà grande il controllo.

al centro : questa è la proprietà su cui probabilmente ti concentrerai per i giochi basati su sprite e le animazioni in cui potrebbero verificarsi movimenti o ridimensionamenti. Per impostazione predefinita, l'animazione e la rotazione si baseranno sul centro di UIView. Raramente ha senso provare a gestire tali oggetti con la proprietà frame.

limiti : questa proprietà non è una proprietà di posizionamento, ma definisce l'area di disegno dell'UIView "relativa" al frame. Per impostazione predefinita, questa proprietà è in genere (0, 0, larghezza , altezza ). La modifica di questa proprietà ti consentirà di disegnare all'esterno della cornice o di limitare il disegno a un'area più piccola all'interno della cornice. Una buona discussione di questo può essere trovata al link sotto. È raro che questa proprietà venga manipolata a meno che non sia necessario regolare la regione di disegno. L'unica eccezione è che la maggior parte dei programmi utilizzerà [[UIScreen mainScreen] bounds]all'avvio per determinare l'area visibile per l'applicazione e configurare di conseguenza il frame iniziale di UIView.

Perché in un UIView è presente un rettangolo di riquadro e un rettangolo di limiti?

Speriamo che questo aiuti a chiarire le circostanze in cui ogni proprietà potrebbe essere utilizzata.


33
Penso che valga la pena aggiungere che boundssono comunemente usati quando a una vista è applicata una trasformazione. In queste circostanze la frameproprietà non è definita. Come sottolineato da altre risposte, la modifica di centere boundsequivale a modificare rispettivamente la posizione e le dimensioni della vista.
Stuart,

36

Sono valori correlati e mantenuti coerenti con i metodi setter / getter della proprietà (e utilizzando il fatto che frame è un valore puramente sintetizzato, non supportato da una variabile di istanza effettiva).

Le equazioni principali sono:

frame.origin = center - bounds.size / 2

(che è lo stesso di)

center = frame.origin + bounds.size / 2

(e c'è anche)

frame.size = bounds.size

Questo non è codice, solo equazioni per esprimere l'invariante tra le tre proprietà. Queste equazioni presuppongono anche che la trasformazione della vista sia l'identità, che è per impostazione predefinita. In caso contrario, i limiti e il centro mantengono lo stesso significato, ma la cornice può cambiare. A meno che non si eseguano rotazioni non ad angolo retto, la cornice sarà sempre la vista trasformata in termini di coordinate della superview.

Questa roba è spiegata in modo più dettagliato con un'utile mini-biblioteca qui:

http://bynomial.com/blog/?p=24


18

Le proprietà center, boundse framesono bloccate: cambiare una aggiornerà gli altri, in modo da usarli nel modo desiderato. Ad esempio, invece di modificare i parametri x / y di frameuna vista più recente, basta aggiornare la centerproprietà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.