Je voudrais savoir comment utiliser ces propriétés de la bonne manière.
Si je comprends bien, frame
peut être utilisé à partir du conteneur de la vue que je crée. Il définit la position de la vue par rapport à la vue du conteneur. Il définit également la taille de cette vue.
center
Peut également être utilisé à partir du conteneur de la vue que je crée. Cette propriété modifie la position de la vue par rapport à son conteneur.
Enfin, bounds
est relatif à la vue elle-même. Il modifie la zone de dessin pour la vue.
Pouvez-vous donner plus d'informations sur la relation entre frame
et bounds
? Qu'en est-il des propriétés clipsToBounds
et masksToBounds
?
Réponses:
Étant donné que la question que j'ai posée a été vue à plusieurs reprises, j'en fournirai une réponse détaillée. N'hésitez pas à le modifier si vous souhaitez ajouter un contenu plus correct.
Tout d'abord un récapitulatif de la question: cadre, limites et centre et leurs relations.
Le cadre La vue
frame
(CGRect
) est la position de son rectangle dans lesuperview
système de coordonnées de. Par défaut, il commence en haut à gauche.Limites Une vue
bounds
(CGRect
) exprime un rectangle de vue dans son propre système de coordonnées.Le centre A
center
estCGPoint
exprimé en termes desuperview
système de coordonnées et détermine la position du point central exact de la vue.Tirées de la position UIView +, voici les relations (elles ne fonctionnent pas dans le code car ce sont des équations informelles) entre les propriétés précédentes:
frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
REMARQUE: ces relations ne s'appliquent pas si les vues sont pivotées. Pour plus d'informations, je vous suggère de jeter un œil à l'image suivante tirée du tiroir de cuisine basé sur le cours Stanford CS193p . Les crédits vont à @Rhubarb .
L'utilisation de
frame
vous permet de repositionner et / ou de redimensionner une vue dans sasuperview
. Peut généralement être utilisé à partir desuperview
, par exemple, lorsque vous créez une sous-vue spécifique. Par exemple:Lorsque vous avez besoin des coordonnées pour dessiner à l'intérieur d'un
view
fichier auquel vous vous référez habituellementbounds
. Un exemple typique pourrait être de dessiner dans uneview
sous-vue en tant qu'encart de la première. Pour dessiner la sous-vue, vous devez connaître la vuebounds
d'ensemble. Par exemple:Différents comportements se produisent lorsque vous modifiez la
bounds
vue. Par exemple, si vous modifiez lebounds
size
, lesframe
modifications (et vice versa). Le changement se produit autourcenter
de la vue. Utilisez le code ci-dessous et voyez ce qui se passe:De plus, si vous changez,
bounds
origin
vous modifiez leorigin
système de coordonnées interne. Par défaut, leorigin
est à(0.0, 0.0)
(coin supérieur gauche). Par exemple, si vous modifiez leorigin
pourview1
vous pouvez voir (commentez le code précédent si vous le souhaitez) que maintenant le coin supérieur gauche pourview2
toucheview1
celui. La motivation est assez simple. Vous ditesview1
que son coin supérieur gauche est maintenant à la position ,(20.0, 20.0)
mais depuisview2
de »frame
origin
les départs à partir(20.0, 20.0)
, ils coïncident.Le
origin
représente laview
position de l 'au sein de sonsuperview
mais décrit la position dubounds
centre.Enfin,
bounds
etorigin
ne sont pas des concepts liés. Les deux permettent de dériver laframe
vue (voir les équations précédentes).Étude de cas de View1
Voici ce qui se passe lors de l'utilisation de l'extrait de code suivant.
L'image relative.
C'est ce qui se passe à la place si je change les
[self view]
limites comme suit.L'image relative.
Ici tu dis à
[self view]
que son coin supérieur gauche est maintenant à la position (30.0, 20.0) mais puisqueview1
l'origine du cadre commence à (30.0, 20.0), ils coïncideront.Références supplémentaires (à mettre à jour avec d'autres références si vous le souhaitez)
À propos
clipsToBounds
(source doc Apple)En d'autres termes, si une vue
frame
est(0, 0, 100, 100)
et sa sous-vue(90, 90, 30, 30)
, vous ne verrez qu'une partie de cette sous-vue. Ce dernier ne dépassera pas les limites de la vue parent.masksToBounds
est équivalent àclipsToBounds
. A la place de aUIView
, cette propriété est appliquée à aCALayer
. Sous le capot, lesclipsToBounds
appelsmasksToBounds
. Pour d'autres références, jetez un œil à Comment est la relation entre les clipsToBounds d'UIView et les masquesToBounds de CALayer? .la source
Cette question a déjà une bonne réponse, mais je veux la compléter avec plus de photos. Ma réponse complète est ici.
Pour m'aider à me souvenir du cadre , je pense à un cadre photo sur un mur . Tout comme une image peut être déplacée n'importe où sur le mur, le système de coordonnées du cadre d'une vue est la vue d'ensemble. (mur = superview, cadre = vue)
Pour m'aider à me souvenir des limites , je pense aux limites d'un terrain de basket . Le basket-ball est quelque part sur le terrain, tout comme le système de coordonnées des limites de la vue est dans la vue elle-même. (court = vue, basket / joueurs = contenu à l'intérieur de la vue)
Comme le cadre, view.center est également dans les coordonnées de la vue d'ensemble.
Frame vs Bounds - Exemple 1
Le rectangle jaune représente le cadre de la vue. Le rectangle vert représente les limites de la vue. Le point rouge dans les deux images représente l'origine du cadre ou des limites dans leurs systèmes de coordonnées.
Exemple 2
Exemple 3
Exemple 4
C'est la même chose que dans l'exemple 2, sauf que cette fois-ci, tout le contenu de la vue est affiché tel qu'il ressemblerait s'il n'était pas coupé aux limites de la vue.
Exemple 5
Encore une fois, voir ici pour ma réponse avec plus de détails.
la source
J'ai trouvé cette image très utile pour comprendre le cadre, les limites, etc.
Veuillez également noter que
frame.size != bounds.size
lorsque l'image est tournée.la source
Je pense que si vous le pensez du point de vue
CALayer
, tout est plus clair.Le cadre n'est pas vraiment une propriété distincte de la vue ou du calque, c'est une propriété virtuelle, calculée à partir des limites, de la position (
UIView
au centre) et de la transformation.Donc, fondamentalement, la façon dont les dispositions de couche / vue sont réellement décidées par ces trois propriétés (et anchorPoint), et aucune de ces trois propriétés ne changera aucune autre propriété, comme changer la transformation ne change pas les limites.
la source
Il y a de très bonnes réponses avec une explication détaillée de ce post. Je voudrais simplement mentionner qu'il existe une autre explication avec une représentation visuelle de la signification de Frame, Bounds, Center, Transform, Bounds Origin dans la vidéo de la WWDC 2011 Comprendre le rendu UIKit à partir de @ 4: 22 jusqu'à 20:10
la source
Après avoir lu les réponses ci-dessus, ajouter ici mes interprétations.
Supposons que vous naviguiez en ligne, votre navigateur Web est votre
frame
qui décide où et quelle taille afficher la page Web. Le défilement du navigateur est votrebounds.origin
qui décide quelle partie de la page Web sera affichée.bounds.origin
est difficile à comprendre. La meilleure façon d'apprendre consiste à créer une application à vue unique, à essayer de modifier ces paramètres et à voir comment les sous-vues changent.la source