web-dev-qa-db-fra.com

Comment activer/désactiver la mise en page automatique pour un contrôleur de vue unique dans le storyboard

Je souhaite activer/désactiver la mise en page automatique pour un contrôleur de vue unique dans le storyboard (appelé scène, je crois) 

Lorsque je vais dans une scène spécifique du storyboard et que je coche la case Use Auto Layout dans l'inspecteur, la mise en page automatique est activée/désactivée pour toutes les scènes du storyboard. 

Je ne peux pas comprendre ce comportement, car pour une personne cette case à cocher ressemble à une propriété d’une scène spécifique et non à l’ensemble du storyboard, et deuxièmement, je ne vois pas pourquoi une disposition de scène avait un rapport avec les autres scènes. 

Est-ce seulement possible? Est-ce possible dans le storyboard ou peut-être seulement dans le code?

15
Mario

Cela peut ressembler à la case "Utiliser la mise en page automatique" concerne une scène spécifique, mais comme vous l'avez découvert, elle s'applique à l'ensemble du "Document Builder Interface" (c'est-à-dire au storyboard). Ainsi, si vous ne voulez pas utiliser la mise en page automatique sur une scène particulière, vous avez quelques alternatives:

  1. Vous pouvez soit placer cette autre scène dans un autre storyboard ou NIB et effectuer une transition par programme vers et depuis le contrôleur de vue. Si vous faites cela, vous perdez de nombreux avantages du scénario (par exemple, vous ne pouvez pas simplement créer des divisions dans IB, mais devez plutôt effectuer une transition vers et à partir de cette scène par programme).

  2. Vous pouvez garder la disposition automatique activée, mais pour le contrôleur de vue en question, vous pouvez programmer:

    • Supprimez toutes les contraintes que IB peut avoir ajoutées (en particulier dans Xcode 6);

    • Ajustez la autoresizingMask pour vos diverses commandes. Si vous voulez que votre autoresizingMask soit honorée, vous pouvez activer translatesAutoresizingMaskIntoConstraints; et

    • Si vous utilisez Xcode 6, vous pouvez également désactiver "Utiliser les classes de taille" afin de disposer correctement la scène pour le périphérique cible. 

    Ainsi, après avoir disposé mon label comme je le souhaitais dans IB, je pouvais alors:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self.view removeConstraints:self.view.constraints];
        [self.label removeConstraints:self.label.constraints];
        self.label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
        self.label.translatesAutoresizingMaskIntoConstraints = YES;
    }
    

    Clairement, ce que vous définissez sur autoresizingMask appartient entièrement à vous (dans cet exemple, je mets une étiquette centrée sur la scène, donc ce qui est indiqué ci-dessus le garde centré lorsque je passe en mode paysage), mais j'espère que cela illustre l'idée.

Franchement, étant donné que vous ne pouvez rien faire avec les masques à redimensionnement automatique que vous ne pouvez pas exprimer facilement dans la mise en page automatique, je serais enclin à rester fidèle à la mise en page automatique et vous éliminerez la maladresse des approches ci-dessus.

24
Rob

Vous pouvez déplacer la disposition de votre contrôleur de vue unique vers un fichier xib distinct et le charger par programme. Et si vous ne voulez tout simplement pas définir vos propres contraintes, vous pouvez laisser votre contrôleur dans le storyboard sans simplement y ajouter de contraintes. Dans ce cas, des contraintes seront automatiquement générées pour vous au moment de l'exécution, en fonction des images des vues enfants du VC.

0
NRitH