Cadre, limites, centre, origine de UIView, quand utiliser quoi?

195

UIViewa les propriétés frame, bounds, centeret origin, et ils semblent tous être reliés entre eux. La plupart du temps, je m'occupe du frameréglage de la position et de la taille de a UIView. Je comprends que j'utilise framele système de coordonnées global et que j'utilise les boundscoordonné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é?

Aubaine
la source
Le lien ci-dessous a la meilleure réponse. stackoverflow.com/questions/5361369/…
Ohmy
Frame vs Bounds avec photos: stackoverflow.com/a/28917673/3681880
Suragch

Réponses:

240

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.

Barney Mattox
la source
33
Je pense qu'il vaut la peine d'ajouter que les boundssont couramment utilisés lorsqu'une vue a une transformation qui lui est appliquée. Dans ces circonstances, la framepropriété n'est pas définie. Comme indiqué par d'autres réponses, la modification de centeret boundséquivaut à modifier la position et la taille de la vue respectivement.
Stuart
36

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:

frame.origin = center - bounds.size / 2

(qui est le même que)

center = frame.origin + bounds.size / 2

(et il y a aussi)

frame.size = bounds.size

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

Tyler
la source
18

Les propriétés center, boundset framesont 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 de framepour recentrer une vue, mettez simplement à jour la centerpropriété.

Marco Mustapic
la source