2014-10-02 11 views
10

Ich habe ein UI-Element (UISwitch tatsächlich, aber spielt keine Rolle), die sowohl führende und nachstehende Leerzeichen in Superview in Interface Builder fixiert hat. Die Einschränkung sieht wie folgt in Xcode 6:iOS8 Auto-Layout programmatisch Pin auf relativen Layout-Rand

Constraint pin

Die Einschränkung für Raum führt effektiv die gleiche ist. Der Wert der Bedingung ist 42,0 Punkte.

Das ist genau das, was ich will, weil für verschiedene Geräte I layoutMargins Eigenschaft auf UIView und die Einschränkungen funktionieren richtig, um Spielraum zwischen den Ansichten zu erhöhen ändern können.

Jetzt möchte ich eine andere Ansicht in Code hinzufügen, die auch beide führende und nachstehende Leerzeichen an seine Superview-Marge gepinnt hätte, so dass die gleichen layoutMargins auf Superview eingestellt arbeiten.

gemerkt ich die Ansicht visuelle Format Sprache mit folgenden Syntax:

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-42.0-[separatorView]-42.0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(self.contentView, separatorView)]; 

[self.contentView addConstraints:constraints]; 
[self.contentView setNeedsUpdateConstraints]; 

Dies funktioniert, aber layoutMargins Eigenschaft hat keine Auswirkungen diese Einschränkung verwendet wird, so ist es offensichtlich nicht auf Marge gemerkt, sondern direkt Superview.

Also meine Frage ist:

Wie in Code mit visuellem Format Sprache UI-Element-Räume zu Rande an Pin? Oder wenn nicht möglich, wie man mit constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: API anheften?

Vielen Dank!

Antwort

14

In iOS8 wurde die visuelle Formatsprache aktualisiert, so dass "| -" oder "- |" verwendet standardmäßig einen Abstand, der durch die Eigenschaft layoutMargins der Superview definiert wird.

So ist die Antwort visuellen Format Sprache ist wie folgt:

// programmatically set the layoutMargins, only if 
// you want non-default values and they are not already set in IB! 
self.contentView.layoutMargins = UIEdgeInsetsMake(0,42,0,42); // set left and right margins to 42 

// assume: seperatorView is already a subview of self.contentView 

// separatorView will use the constraints because we write "-" between it and the superview edge 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[separatorView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(separatorView)]; 
[self.contentView addConstraints:constraints]; 

Wenn Sie auf die Layout-Ränder beziehen möchten, wenn die Einschränkungen über die direkte API erstellen, dann verwenden Sie die neue iOS8 nur Layout-Attribute:

NSMutableArray * constraints = [NSMutableArray array]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
    attribute:NSLayoutAttributeLeftMargin 
    relatedBy:NSLayoutRelationEqual 
    toItem:separatorView 
    attribute:NSLayoutAttributeLeft 
    multiplier:1.0 
    constant:0]]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
    attribute:NSLayoutAttributeRightMargin 
    relatedBy:NSLayoutRelationEqual 
    toItem:separatorView 
    attribute:NSLayoutAttributeRight 
    multiplier:1.0 
    constant:0]]; 
[self.contentView addConstraints:constraints]; 
4

ich bin damit einverstanden, „In iOS8 das visuelle Format Sprache wurde aktualisiert, so dass‚| -‘oder‚- |‘. Standard wird von der Super der layoutMargins Eigenschaft definiert einen Abstand zu verwenden“

Sie sollten also die Option "Begrenzt auf Rand" aktivieren, wenn Sie den Builder für Schnittstellen verwenden, um Ihr Layout zu unterstützen. Wenn ja, dann funktioniert es.

Wenn das Problem immer noch nicht gelöst war, könnten Sie mir ein Demo-Projekt geben?

Hinzugefügt: T his article whcih zeigen Sie uns die Funktion der neuen ios8 API bewahrtSuperviewLayoutMargins, wünschen es mehr hilfreich sein.

Verwandte Themen