UIView
a les propriétés frame
, bounds
, center
et origin
, et ils semblent tous être reliés entre eux. La plupart du temps, je m'occupe du frame
réglage de la position et de la taille de a UIView
. Je comprends que j'utilise frame
le système de coordonnées global et que j'utilise les bounds
coordonnées de la vue locale (donc ses x et y sont 0, mais pas toujours), mais cela me dérange toujours quand utiliser quoi.
Sous quel contexte (et quel est le bon moment) les autres propriétés ( bounds
, center
, origin
) doit être utilisé?
Réponses:
La réponse de Marco ci-dessus est correcte, mais juste pour développer la question de "dans quel contexte" ...
frame - c'est la propriété que vous utilisez le plus souvent pour les applications iPhone normales. la plupart des contrôles seront disposés par rapport au contrôle "contenant" de sorte que frame.origin correspondra directement à l'endroit où le contrôle doit s'afficher, et frame.size déterminera la taille du contrôle.
centre - c'est la propriété sur laquelle vous vous concentrerez probablement pour les jeux et animations basés sur les sprites où des mouvements ou des échelles peuvent se produire. Par défaut, l'animation et la rotation seront basées sur le centre de l'UIView. Il est rarement judicieux d'essayer de gérer ces objets par la propriété frame.
limites - cette propriété n'est pas une propriété de positionnement, mais définit la zone de dessin de l'UIView "par rapport" au cadre. Par défaut, cette propriété est généralement (0, 0, largeur , hauteur ). La modification de cette propriété vous permettra de dessiner à l'extérieur du cadre ou de restreindre le dessin à une zone plus petite à l'intérieur du cadre. Une bonne discussion à ce sujet peut être trouvée sur le lien ci-dessous. Il est rare que cette propriété soit manipulée à moins qu'il ne soit spécifiquement nécessaire d'ajuster la zone de dessin. La seule exception est que la plupart des programmes utiliseront
[[UIScreen mainScreen] bounds]
le démarrage pour déterminer la zone visible de l'application et configurer le cadre de leur UIView initial en conséquence.Pourquoi y a-t-il un rectangle de cadre et un rectangle de limites dans une UIView?
Espérons que cela aide à clarifier les circonstances dans lesquelles chaque propriété pourrait être utilisée.
la source
bounds
sont couramment utilisés lorsqu'une vue a une transformation qui lui est appliquée. Dans ces circonstances, laframe
propriété n'est pas définie. Comme indiqué par d'autres réponses, la modification decenter
etbounds
équivaut à modifier la position et la taille de la vue respectivement.Ce sont des valeurs liées et maintenues cohérentes par les méthodes setter / getter de propriété (et en utilisant le fait que le cadre est une valeur purement synthétisée, non soutenue par une variable d'instance réelle).
Les principales équations sont:
(qui est le même que)
(et il y a aussi)
Ce n'est pas du code, juste des équations pour exprimer l'invariant entre les trois propriétés. Ces équations supposent également que la transformation de votre vue est l'identité, qui est par défaut. Si ce n'est pas le cas, les limites et le centre conservent la même signification, mais le cadre peut changer. Sauf si vous effectuez des rotations sans angle droit, le cadre sera toujours la vue transformée en termes de coordonnées de la vue d'ensemble.
Ce truc est expliqué plus en détail avec une mini-bibliothèque utile ici:
http://bynomial.com/blog/?p=24
la source
Les propriétés
center
,bounds
etframe
sont emboîtées: changer une mettra à jour les autres, afin de les utiliser comme vous le voulez. Par exemple, au lieu de modifier les paramètres x / y deframe
pour recentrer une vue, mettez simplement à jour lacenter
propriété.la source