web-dev-qa-db-fra.com

NSLayoutConstraints et définition dynamique de la largeur/hauteur d'une vue

J'ai une question à propos de la définition de la taille d'une vue à laquelle j'applique des contraintes de mise en page.
Comment puis-je définir la taille de la vue sans définir son cadre?

J'essaie de créer une vue dont la hauteur est fixe et qui a une origine à l'écran Origine. Il remplit la largeur de la vue, de sorte que, lorsque l'appareil tourne, la vue s'étend jusqu'à la largeur de l'écran. C'est ce que j'ai jusqu'ici ...

self.containerView = [[HitTestContainerView alloc] init];
[self.containerView setBackgroundColor:[UIColor redColor]];
[self.view addSubview:self.containerView];

NSDictionary *viewsDictionary = @{@"view":self.containerView};
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-250-|" options:0 metrics:nil views:viewsDictionary];
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:verticalConstraints];
[self.view addConstraints:horizontalConstraints];

Le problème est que je ne peux rien afficher à l'écran à moins de définir le cadre de cette containerView. Quelle est la bonne façon de faire cela sans utiliser Interface Builder?

31
Sean Danzeiser

Pour définir la hauteur et la largeur d'une vue à l'aide de contraintes de disposition, vous devez définir la hauteur et la largeur de la vue à l'aide de contraintes de disposition. Par exemple, vous dites déjà:

NSArray *verticalConstraints = 
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-250-|" 
    options:0 metrics:nil views:viewsDictionary];

Donc, vous pouvez simplement changer cela en:

NSArray *verticalConstraints = 
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(50)-[view(40)]" 
    options:0 metrics:nil views:viewsDictionary];

Maintenant, la vue sera à 50 pixels du haut de son aperçu et à une hauteur de 40 pixels.

Vous pouvez également utiliser constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: pour définir la contrainte de hauteur; la toItem sera nulle, bien sûr, puisqu'il n'y a pas de relation avec une autre vue.

44
matt

J'ai écrit un petit outil qui vous aidera avec ceci:

http://autolayoutconstraints.com

Voici la réponse à votre question générée automatiquement par l'outil

Objectif c

// align view from the left and right
[self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];

// width constraint
[self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view(==250)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];

// height constraint
[self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view(==50)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];

Rapide

// align view from the left and right
self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view]));

// width constraint
self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[view(==250)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view]));

// height constraint
self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[view(==50)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view]));
48
Chad Scira

Mieux vaut tard que jamais...

Pour Storyboard, IB et Swift:

Contrôlez simplement, faites glisser votre contrainte comme n'importe quel autre contrôle sur votre viewController

@IBOutlet weak var spaceToTopThatIDecided: NSLayoutConstraint!

puis changez-le simplement:

spaceToTopThatIDecided.constant = 44

C'est tout!

7
Luismi

vous n'êtes pas obligé d'utiliser les méthodes addConstraints :()

- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_MAC(10_7);

// Cette méthode est obsolète et devrait être évitée. Au lieu de cela, définissez la propriété active de NSLayoutConstraint sur YES.

- (void)addConstraints:(NSArray *)constraints NS_AVAILABLE_MAC(10_7);   

// Cette méthode est obsolète et devrait être évitée. Utilisez plutôt 

+[NSLayoutConstraint activateConstraints:].

// sont tellement besoin d'utiliser

+ (void)activateConstraints:(NSArray *)constraints NS_AVAILABLE(10_10, 8_0);

// puis mis comme

NSView *view,*containerView;
view =//superview
containerView=//subview
[view addSubview:containerView];

// ajout de contraintes

[containerView setTranslatesAutoresizingMaskIntoConstraints:NO];

// à ce sujet, lu dans la documentation Apple

// puis ajoute des contraintes comme 

[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-50-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(containerView)]];
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(containerView)]];

// c'est tout.

3
ERbittuu

Swift 4: Vous pouvez gérer la largeur et la hauteur, en plus des espaces de début, de fin et de bas et juste avec les 2 options ci-dessous.

 //1 . left and right spacing
    theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[view]-16-|", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

 //2. top and bottom spacing
    theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[view]-16-|", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

OU Pour être plus spécifique et avoir des contraintes distinctes pour W, H, espacement gauche, espacement supérieur, vous pouvez procéder comme suit

 //left only spacing
        theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[view]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

//top only spacing
        theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[view]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

//width
        theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[view(==130)]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

//height
        theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[view(==100)]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))
0
Naishta