Le cadre, les limites, le centre, l’origine d’UIView, quand utiliser quoi?

UIView a les propriétés frame , bounds , center et origin et toutes semblent être liées. La plupart du temps, je UIView frame lors de la définition de la position et de la taille d’un UIView . Je comprends que frame utilise le système de coordonnées global et que les bounds utilisent les coordonnées de la vue locale (par conséquent, ses x et y sont 0, mais pas toujours), mais je ne sais toujours pas quand utiliser quoi.

Dans quel contexte (et quel est le bon moment) les autres propriétés ( bounds , center , origin ) doivent-elles être utilisées?

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” afin que le frame.origin corresponde directement à l’endroit où le contrôle doit afficher, et frame.size déterminera la taille du contrôle.

center – c’est la propriété sur laquelle vous allez probablement vous concentrer pour les jeux basés sur les sprites et les animations où le mouvement ou la mise à l’échelle peuvent se produire. Par défaut, l’animation et la rotation seront basées sur le centre de l’UIView. Il est rarement logique d’essayer de gérer de tels objects avec la propriété frame.

bounds – cette propriété n’est pas une propriété de positionnement, mais définit la zone pouvant être dessinée du UIView “relatif” 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 en dehors du cadre ou de restreindre le dessin à une zone plus petite 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 soit nécessaire de modifier la zone de dessin. La seule exception est que la plupart des programmes utiliseront les [[UIScreen mainScreen] bounds] au démarrage pour déterminer la zone visible de l’application et configurer leur cadre UIView initial en conséquence.

Pourquoi existe-t-il un rectangle de cadre et un rectangle de limites dans un UIView?

Espérons que cela aide à clarifier les circonstances dans lesquelles chaque propriété peut être utilisée.

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 frame est une valeur purement synthétisée, non soutenue par une variable d’instance réelle).

Les principales équations sont les suivantes:

 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é, par défaut. Si ce n’est pas le cas, alors les limites et le centre gardent la même signification, mais le cadre peut changer. À moins que vous ne fassiez des rotations à angle droit, le cadre sera toujours la vue transformée en termes de coordonnées de la superview.

Tout cela est expliqué plus en détail avec une mini-bibliothèque utile ici:

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

Les propriétés center , bounds et frame sont nestedes: si vous en modifiez une, les autres seront mises à jour, alors utilisez-les comme vous le souhaitez. Par exemple, au lieu de modifier les parameters x / y du frame pour recentrer une vue, il vous suffit de mettre à jour la propriété center .