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?
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.
Ich habe ein kleines Tool geschrieben, das Ihnen dabei helfen wird:
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]));
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!
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.
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]))