2013-08-12 5 views
10

Ich versuche, obere und untere Padding auf eine Ansicht in Auto-Layout mit der visuellen Formatsprache einzustellen. Der Code kompiliert und funktioniert, wenn ich die Paddings als Ganzzahlen in die visuelle Formatzeichenfolge schreibe, aber es schlägt fehl, wenn ich versuche, sie durch eine Konstante zu ersetzen. Hier ist der Fehler Ich erhalte:Wie wird die NSNumber- oder CGFloat-Konstante in der visuellen Sprache für das automatische Layout verwendet?

beenden app aufgrund nicht abgefangene Ausnahme ‚NSInvalidArgumentException‘ Grund: ‚Kann nicht Einschränkung Format zu analysieren: Es ist nicht möglich, einen Raum gleich der Breite oder Höhe einzustellen von eine Sicht. Vielleicht möchten Sie eine Ansicht als Abstandhalter verwenden? [view1] [spacer (== view1)] [view2] V: | -kTopAndBottomPadding- [NachrichtentextView] -kTopAndBottomPadding- |

Und das ist mein Code.

CGFloat const SPMTVC_kTopAndBottomPadding = 5.0; 
// ... 

// Create my own NSDictionary of variable bindings. 
NSDictionary *variableBindings = @{@"messageTextView" : _messageTextView, 
    @"contentView" : self.contentView, 
    @"kTopAndBottomPadding" : [NSNumber numberWithFloat:SPMTVC_kTopAndBottomPadding]}; 

// Constraints in the horizontal axis. 
// Basically just pins the view to the left and right of superview. 
NSMutableArray *constraints = [[NSLayoutConstraint 
    constraintsWithVisualFormat:@"H:|-0-[messageTextView(==contentView)]-0-|" 
    options:NSLayoutFormatAlignAllLeading 
    metrics:nil 
    views:variableBindings] mutableCopy]; 

// Constraints in vertical axis, give 5-point padding from superview's top & bottom. 
[constraints addObjectsFromArray:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:|-kTopAndBottomPadding-[messageTextView]-kTopAndBottomPadding-|" 
    options:NSLayoutFormatAlignAllTop 
    metrics:nil 
    views:variableBindings]]; 

for (NSLayoutConstraint *constraint in constraints) { 
    [self.contentView addConstraint:constraint]; 
} 

denke ich die Fehlermeldung bedeutet, dass der Compiler denkt kTopAndBottomPadding ist ein UIView, wenn es ein NSNumber wie im Wörterbuch definiert. Gibt es eine Möglichkeit, das richtig zu machen?

Antwort

29

Dies ist, was das Metrikwörterbuch ist. So zum Beispiel, wenn Sie „padding“ als Konstante in Ihrer VFL Zeichenfolge verwenden möchten, tun Sie etwas wie folgt aus:

[constraints addObjectsFromArray:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:|-padding-[messageTextView]-kTopAndBottomPadding-|" 
    options:NSLayoutFormatAlignAllTop 
    metrics:@{@"padding":@5} 
    views:variableBindings]]; 
+1

Sie können die Metriken erstellen Wörterbuch als auch NSDictionaryOfVariableBindings (Padding) Makro. – LightningStryk

+0

Wenn Ihre Klasse nicht bereits Ivars für die Metriken enthält, haben Sie keinen großen Vorteil gegenüber der Verwendung von Dictionary-Literalen – uchuugaka

2

Sie müssen kTopAndBottomPadding in dem Metrikwörterbuch übergeben, nicht das Ansichten-Wörterbuch.

Vielleicht möchten Sie auch nur die addConstraints: Methode nutzen, anstatt sich mit veränderbaren Arrays und for/in Schleifen herumzuärgern.

CGFloat const SPMTVC_kTopAndBottomPadding = 5.0; 
// ... 

NSDictionary *metrics = @{ 
    @"kTopAndBottomPadding" : @(SPMTVC_kTopAndBottomPadding) 
}; 
NSDictionary *views = @{ 
    @"messageTextView" : _messageTextView, 
    @"contentView" : self.contentView 
}; 

[self.contentView addConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"H:|-0-[messageTextView(==contentView)]-0-|" 
    options:NSLayoutFormatAlignAllLeading 
    metrics:metrics views:views]]; 

[self.contentView addConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:|-kTopAndBottomPadding-[messageTextView]-kTopAndBottomPadding-|" 
    options:NSLayoutFormatAlignAllTop 
    metrics:metrics views:views]]; 
Verwandte Themen