web-dev-qa-db-ger.com

NSLayoutConstraints und dynamisches Festlegen der Breite/Höhe einer Ansicht

Ich habe eine Frage zum Festlegen der Größe einer Ansicht, auf die ich einige Layouteinschränkungen anwende.
Wie kann ich die Größe der Ansicht definieren, ohne ihren Rahmen zu definieren?

Ich versuche, eine Ansicht zu erstellen, deren Höhe fixiert ist und auf dem Bildschirm Origin einen Ursprung hat. Sie füllt die Breite der Ansicht aus, sodass sich die Ansicht bei einer Drehung des Geräts auf die Breite des Bildschirms erstreckt. Das ist was ich bis jetzt habe ...

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];

Das Problem ist, dass ich nichts auf dem Bildschirm sehen kann, wenn ich nicht den Rahmen dieser containerView setze. Was ist der richtige Weg, dies ohne den Interface Builder zu tun?

31
Sean Danzeiser

Um die Höhe und Breite einer Ansicht mithilfe von Layoutbeschränkungen zu definieren, definieren Sie die Höhe und Breite der Ansicht mithilfe von Layoutbeschränkungen. Zum Beispiel sagen Sie schon:

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

Sie könnten das also einfach ändern in:

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

Die Ansicht wird jetzt 50 Pixel vom oberen Rand des Übersichts entfernt und 40 Pixel hoch sein.

Alternativ können Sie constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: verwenden, um die Höhenbeschränkung festzulegen. Die toItem wird natürlich gleich Null sein, da keine Beziehung zu einer anderen Ansicht besteht.

44
matt

Ich habe ein kleines Tool geschrieben, das Ihnen dabei helfen wird:

http://autolayoutconstraints.com

Hier ist die Antwort auf Ihre Frage, die vom Tool automatisch generiert wird

Ziel 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)]];

Schnell

// 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

Besser spät als nie...

Für Storyboard, IB und Swift:

Ziehen Sie Ihre Einschränkung einfach wie jedes andere Steuerelement auf Ihren viewController

@IBOutlet weak var spaceToTopThatIDecided: NSLayoutConstraint!

dann einfach ändern:

spaceToTopThatIDecided.constant = 44

Das ist alles!

7
Luismi

sie müssen die addConstraints :() -Methoden nicht verwenden

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

// Diese Methode ist veraltet und sollte vermieden werden. Setzen Sie stattdessen die aktive Eigenschaft von NSLayoutConstraint auf YES.

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

// Diese Methode ist veraltet und sollte vermieden werden. Verwenden Sie stattdessen 

+[NSLayoutConstraint activateConstraints:].

// müssen also verwendet werden

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

// dann gleich setzen

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

// Hinzufügen von Einschränkungen

[containerView setTranslatesAutoresizingMaskIntoConstraints:NO];

// darüber aus der Apple-Dokumentation

// dann füge Bedingungen hinzu wie 

[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)]];

// das ist es.

3
ERbittuu

Swift 4: Sie können die Breite und Höhe zusätzlich zum Führungs-, Nachlauf- und oberen und unteren Bereich mit den beiden folgenden Optionen verwalten

 //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]))

OR Um genauer zu sein und separate Beschränkungen für W, H, linken Abstand und oberen Abstand zu haben, können Sie wie folgt vorgehen

 //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