2009-04-14 14 views
41

Beh, anche se è tardi nella notte buia, non capisco perché ci sono due diversi rettangoli: cornice e limiti.Perché c'è un rettangolo di cornice e un rettangolo di limiti in un UIView?

Come ho capito, un solo rettangolo sarebbe stato solo per fare tutto. Posizionare la vista stessa rispetto a un altro sistema di coordinate e quindi ritagliare il contenuto in una dimensione specificata. Cos'altro faresti con due rettangoli? E come interagiscono tra loro?

Qualcuno ha una buona spiegazione? Quello della mela doc con il bambino che tiene il frutto non è abbastanza buono per la comprensione.

risposta

82

Ecco il bigino:

  • frame è dove la vista è (rispetto alla superview)
  • bounds è dove la vista è consentito di disegnare (rispetto a se stesso)

Altri chiarimenti:

Se si posiziona la vista nella sua superview, si modifica quasi sempre l'origine del frame.

Se si sta ritagliando dove si sta disegnando UIView, quasi sempre si modificano i suoi limiti.

Nota che è possibile avere limiti maggiori del frame. Cioè, puoi disegnare "fuori dalle righe" di dove sei.

+0

in modo che il fotogramma assomigli a una coordinata di partenza relativa al sistema di coordinate superview e da quel punto di partenza il taglio dei limiti sarà eseguito in coordinate relative al sistema di coordinate della vista? – Thanks

+0

Ho notato che i limiti hanno sempre 0,0 punto iniziale. Quindi i limiti iniziano sempre da 0. Sono corretto? –

+0

L'origine dei limiti in genere è 0,0. Non è richiesto di essere così però. – amattn

5

La cornice si trova nel sistema di coordinate della superview, i limiti sono nel sistema di coordinate della vista. Dal mio punto di vista, è una comodità avere entrambi. Frame sembra essere il più utile dei due, a meno che non ci sia un caso in cui non sono a conoscenza di dove una sottoview può avere un sistema di coordinate completamente diverso (ad esempio pixel ridimensionato in modo diverso) rispetto alla superview.

+0

c'è. Se si modifica la proprietà di trasformazione della sottoview, ad esempio impostando la sua rotazione, i suoi limiti saranno invariati, ma il suo sistema di coordinate sarà diverso da quello della superview. – jdc

2

Ultimamente ho avuto problemi con i limiti e ho fatto alcuni esperimenti. La proprietà bounds limita dove un UIView può disegnare, ma non è limitare le sue subviews. I controlli sui limiti delle altre cose sono il dispatching di eventi touch. Una vista non può, per quanto posso dire, ricevere eventi di tocco che sono al di fuori dei suoi limiti. Inoltre, qualsiasi sottoview che non includa i limiti della vista principale non riceverà nemmeno gli eventi di tocco. In queste situazioni, devi aggiornare meticolosamente i limiti della vista del contenitore quando cambiano la dimensione e la posizione delle sue sottoview. Tutto andrà sempre bene (perché le sottoview non vengono troncate dai limiti dei loro genitori) ma i tocchi non verranno ricevuti.

(Questo in realtà dovrebbe essere una risposta a un precedente post, ma dal momento che non posso rispondere Eppure, è bloccato qui ...)

+2

Le visioni hanno una proprietà 'clipsToBounds' che impedisce la sua sottoview da colorare al di fuori delle linee. – amattn

+0

Se si esegue l'override di pointInside: withEvent è possibile intercettare gli eventi di tocco dall'esterno della cornice delle viste. Ottimo per creare pulsanti più grandi di quanto non appaiano. – kubi

+0

se è stata applicata una trasformazione è l'evento di tocco tradotto nel sistema di coordinate dei limiti? – Sam

Problemi correlati