Odpowiedz

13

nr

Jednak można to zrobić w formacie wizualnym i ręcznym tworzeniu więzów. Zmień swój ciąg VFL do:

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

Ten mówi, że nie jesteś zbyt zaniepokojeni rzeczywistej wielkości przestrzeni między A i B, a B i C.

Teraz utworzymy ograniczenie przypinające środek b do środka superwizji za pomocą constraintWithItem:... (Piszę to na telefonie, więc wybacz mi, że nie wymawiam całej metody).

To, w połączeniu z elastycznymi odstępami, zapewni równe odstępy po lewej i prawej stronie b.

+0

To brzmi wspaniały. Dam mu szansę. Dzięki! – flohei

+0

Działa po prostu świetnie. Tak prosty. Dzięki! :-) – flohei

+0

Jak dokładnie "przypnij środek b do centrum superview", @flohei? I nie jest możliwe, aby użyć formatu wizualnego do tego, lub należy użyć 'constraintWithItem: atrybut: relatedBy: toItem: atrybut: mnożnik: stała:'? –

15

Firma Apple podaje numer Auto Layout Guide za pomocą "widoków z przekładek". Oto rozwiązanie dla kur swoje trzy widoki z równych odstępach poziomo:

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

Należy zauważyć, że szerokość spacer1 „s jest ustawiony na więcej niż 0. Kolejne odsłony dystansowe są ustawione na równych szerokościach z spacer1.

+0

Czy istnieje powód, dla którego nie napisałeś po prostu 'NSDictionary * views = NSDictionaryOfVariableBindings (viewA, viewB, viewC);'? –

+0

Edytowałem swoją odpowiedź, aby użyć wielu argumentów w NSDictionaryOfVariableBindings. Używam zmiennego słownika, aby móc dynamicznie dodawać do niego widoki spacerów. –

+0

Och, racja.^___^'NSMutableDictionary * views = NSDictionaryOfVariableBindings (viewA, viewB, viewC) .mutableCopy;' then. –