Antwort

13

Nr

jedoch können Sie es mit visuellem Format und einer manuellen Constraint Erstellung tun. Ändern Sie Ihre VFL Zeichenfolge:

@"|-[a(5)]->=0-[b(8)]->=0-[c(5)]-|" 

Dies sagt, dass Sie nicht allzu besorgt sind über die tatsächliche Größe der Räume zwischen a und b, und b und c.

Jetzt erstellen Sie eine Constraint pinning das Zentrum von b in der Mitte der Superview mit constraintWithItem:... (Ich tippe dies auf einem Telefon, also verzeihen Sie mir nicht die ganze Methode Schreibweise).

Dies, zusammen mit Ihren flexiblen Abstand, wird gleichmäßige Räume links und rechts von b geben.

+0

Das klingt groß. Ich werde es versuchen. Vielen Dank! – flohei

+0

Funktioniert einfach großartig. So einfach. Vielen Dank! :-) – flohei

+0

Wie genau hast du "das Zentrum von b ins Zentrum des Superviews gesteckt", @flohei? Und ist es nicht möglich, das visuelle Format auch dafür zu verwenden oder muss man 'constraintWithItem: attribut: relatedBy: toItem: attribute: multiplier: constant:'? –

15

Apples Auto Layout Guide schlägt vor, "spacer views" zu verwenden. Hier ist die Lösung für das Layout Ihrer drei Ansichten mit gleichem Abstand horizontal:

// create views dictionary 
NSMutableDictionary *viewsDictionary = [NSMutableDictionary dictionary]; 
[viewsDictionary addEntriesFromDictionary:NSDictionaryOfVariableBindings(viewA, viewB, viewC)]; 

// create 4 spacer views 
for (int i = 0; i < 4; i++) { 
    UIView *spacerView = [[UIView alloc] init]; 
    spacerView.hidden = YES; 
    [self addSubview:spacerView]; 
    [viewsDictionary setObject:spacerView 
         forKey:[NSString stringWithFormat:@"spacer%d", i + 1]]; 
} 

// disable translatesAutoresizingMaskIntoConstraints in views for auto layout 
[viewsDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) 
{ 
    [obj setTranslatesAutoresizingMaskIntoConstraints:NO]; 
}]; 

// add constraints 
[superview addConstraints: 
[NSLayoutConstraint constraintsWithVisualFormat: 
    @"|[spacer1(>=0)][viewA][spacer2(==spacer1)][viewB][spacer3(==spacer1)][viewC][spacer4(==spacer1)]|" 
             options:kNilOptions 
             metrics:nil 
              views:viewsDictionary]]; 

Beachten Sie, dass spacer1 ‚s Breite eingestellt ist mehr als 0 Nachfolgende Spacer Ansichten sein werden auf gleiche Breiten haben mit spacer1.

+0

Gibt es einen Grund, warum Sie nicht einfach 'NSDictionary * views = NSDictionaryOfVariableBindings (viewA, viewB, viewC) geschrieben haben?' '? –

+0

Ich habe meine Antwort bearbeitet, um mehrere Argumente in NSDictionaryOfVariableBindings zu verwenden. Ich benutze ein veränderbares Wörterbuch, damit ich dynamisch meine Spacer-Ansichten hinzufügen kann. –

+0

Oh, richtig.^___^'NSMutableDictionary * Ansichten = NSDictionaryOfVariableBindings (viewA, viewB, viewC) .mutableCopy;' then. –