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?
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.
J'ai écrit un petit outil qui vous aidera avec ceci:
http://autolayoutconstraints.com
// 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)]];
// 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]));
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!
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.
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]))