55 votes

Mise en page et dimensionnement des sous-vues dans un UIViewController

J'ai une application avec une UITabController et chaque onglet est un UINavigationController. La racine de l'un de mes UINavigationControllers est UIViewController.

À l'intérieur de ce point de vue du contrôleur de vue, je tiens à la disposition de certains des sous-vues, mais je suis confus sur où et comment les agencer de façon à être indépendant de la résolution (c'est à dire de ne pas coder en dur des valeurs telles que la 320px, 480px, 44px, etc.).

Lorsque la vue est entièrement équipé et est présenté sur un vertical de l'iPhone, c'est la hauteur sera 367px = 480 - 20 (barre d'état) - 44 (barre de navigation) - 49 (barre d'onglet).

À l'intérieur de la vue-contrôleur, j'ai actuellement de créer tous mes sous-vues au sein de l' viewDidLoad méthode. Cependant, il semble que dans cette méthode, le point de vue de la hauteur actuelle est 460px (self.view.bounds.size.height). Donc, lors de la configuration de mon sous-vues, je ne peux pas calculer correctement les tailles de quoi que ce soit.

Au sein de l' viewWillAppear: méthode, le point de vue ne sais que c'est la bonne taille, mais cela signifierait cadre et de calcul de la sous-vue de la cadres de tous les temps, la vue s'affiche (par exemple, l'onglet des changements ou des pans de vue d'enfant contrôleurs de la navigation de la pile.

Est la seule façon de le faire correctement à disposition en viewWillAppear:?

J'ai essayé d'utiliser le d'un redimensionnement automatique des propriétés (parent autoresizesSubviews & autoresizingMask), mais ils ne semblent pas du tout!? Ces ne prendra effet qu'une fois que le point de vue est tout de configuration et puis c'est redimensionnée (manuellement / changement d'orientation?).

Je serais reconnaissant si quelqu'un pourrait me permettre de savoir pourquoi la d'un redimensionnement automatique ne fonctionne pas, et la meilleure façon de jeter les choses par ne pas coder en dur toutes les tailles.

47voto

aumanets Points 739

Vous pouvez faire votre logique de présentation dans les viewWillLayoutSubviews des UIViewController .

 -(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    // Your layout logic here
}
 

DOC: Appelé juste avant que la méthode layoutSubviews du contrôleur de la vue soit appelée. Les sous-classes peuvent être mises en œuvre si nécessaire. La valeur par défaut est un nop.

36voto

DenNukem Points 3455

autoresizesSubviews doit être réglé sur vos parents, bien qu' autoresizingMask doit être réglé sur l'enfant du point de vue - c'est l'erreur que j'ai faite de sorte que vous pourriez aussi.

En loadView vous la taille de votre sous-vues pour s'adapter quelle que soit la taille de la vue parent à l'instant, et puis plus tard, lors de la vue parent est redimensionnée de 460 à 367 pixels de votre sous-vues seront redimensionnées ainsi, en fonction de vos paramètres du masque ci-dessus.

Si cela échoue, il n'y a rien de mal dans la définition de la taille de la vue dans viewWillAppear - l'impact sur les performances de le faire à chaque fois est négligeable.

Si rien ne fonctionne, il y a toujours layoutSubviews: - de là, vous pouvez le faire en manuel de mise en page si vous avez, il est invoqué lorsque le système croit que la mise en page à modifier. il est également setNeedsLayout: que j'ai parfois l'appeler à partir de viewWillRotate:/viewDidRotate: etc. Mais cela ne devrait pas être nécessaire et autoresize devrait être assez bon.

EDIT: Oui, pour mettre en œuvre la mise en page personnalisée logique en layoutSubviews comme je le mentionne ci-dessus, l'on a besoin pour sous - UIView.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X