web-dev-qa-db-fra.com

Le cadre, les limites, le centre, l'origine, de UIView, quand utiliser quoi?

UIView a les propriétés frame, bounds, center et Origin, et elles semblent toutes interdépendantes. La plupart du temps, je traite avec 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 bounds utilise les coordonnées de la vue locale (donc x et y valent 0, mais pas toujours), mais cela m’embrouille toujours quand utiliser quoi.

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

194
Boon

La réponse de Marco ci-dessus est correcte, mais je voudrais juste développer la question de "dans quel contexte" ...

frame - il s'agit de 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 être affiché, et frame.size déterminera la taille du contrôle.

center - il s'agit de la propriété sur laquelle vous allez probablement vous concentrer pour les jeux et les animations basés sur Sprite où des mouvements ou une mise à l'échelle peuvent se produire. Par défaut, l'animation et la rotation seront basées sur le centre de UIView. Il est rarement logique d'essayer de gérer de tels objets à l'aide de 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 de la vue UIV "relative" au cadre. Par défaut, cette propriété est généralement (0, 0, largeur, hauteur). Changer cette propriété vous permettra de dessiner en dehors du cadre ou de limiter le dessin à une zone plus petite du cadre. Une bonne discussion à ce sujet se trouve sur le lien ci-dessous. Il est rare que cette propriété soit manipulée sauf en cas de nécessité spécifique d'ajuster la région de dessin. La seule exception est que la plupart des programmes utilisent le [[UIScreen mainScreen] bounds] au démarrage pour déterminer la zone visible de l'application et configurer son cadre initial UIView 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.

238
Barney Mattox

Ce sont des valeurs liées, maintenues cohérentes par les méthodes property setter/getter (et utilisant le fait que frame est une valeur purement synthétisée, non sauvegardée par une variable d'instance réelle).

Les équations principales 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é, qu'elle est par défaut. Si ce n'est pas le cas, bornes et centre conservent le même sens, 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.

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

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

36
Tyler

Les propriétés center, bounds et frame sont imbriquées: la modification d'une des propriétés mettra à jour les autres, utilisez-les comme vous le souhaitez. Par exemple, au lieu de modifier les paramètres x/y de frame pour actualiser une vue, mettez simplement à jour la propriété center.

18
Marco Mustapic