2013-01-07 12 views
8

Jeśli mam widok w moim app z 3 subviews (jako przykład) z następującym odstępem między nimi:Korzystanie Auto Layout zmienić obowiązuje w równym stopniu od rozmiaru

TOP - 40 punktów - podrzędny 1 - 60 punktów - PODKŁAD 2 - 80 punktów - PODGLĄD 3 - 80 punktów - BOTTOM

Rozumiem, w jaki sposób mogę korzystać z automatycznego układu, aby zapewnić, że każdy z moich podobrazów zachowuje jego wysokość i szerokość, i mogę uzyskać wszystko, aby uzyskać wyrównanie na 3,5 LUB 4-calowy ekran iPhone'a.


Ale nie mogę pracować się, jakiego rodzaju przymusu muszę zrobić to tak, jakby były ustawione na 3,5" ekranie, a następnie udał się do 4" ekran, każdy rozstaw zwiększyłaby proporcjonalnie (np. 40 punktów wynosiłoby 47, 60 do 71, 80 do 95 - lub w przybliżeniu).

Czy to możliwe? Czy muszę zrobić wszystkie odstępy równe między elementami? (Jeśli tak, jak bym jeszcze zmusić go do zmiany rozmiaru równie?)


Jestem nowy na Auto Layout więc jeśli Tęskniłam nic się lub nie jasno, co oznacza, że ​​należy daj mi znać, dziękuję.

Odpowiedz

1

Nie znam żadnego prostego sposobu na zrobienie tego. Zrobiłem taki, w którym wszystkie przestrzenie były równe, ale aby to zrobić, musiałem wypełnić przestrzenie niewidzialnymi etykietami (tylko etykieta bez tytułu). Tak więc, moje 4 widoczne obiekty i 5 "etykiety dystansowe" znajdowały się dokładnie jeden na drugim. Zrobiłem 4 widocznych obiektów wszystkie mają wyraźne szczyty, a dystanse bez ustalonych wysokościach, ale ustawiony być wszystkie takie same:

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary]; 
    for (int i=1; i<5; i++) { // Labels with titles 
     UILabel *b = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 44)]; 
     b.text = @"This is my label"; 
     [b setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [viewsDict setObject:b forKey:[NSString stringWithFormat:@"b%d",i]]; 
    } 

    for (int i=1; i<6; i++) { // Spacer labels 
     UILabel *l = [[UILabel alloc ]init]; 
     [l setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [viewsDict setObject:l forKey:[NSString stringWithFormat:@"l%d",i]]; 
    } 

    for (id obj in viewsDict.allKeys) 
     [self.view addSubview:viewsDict[obj]]; 

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[l1][b1][l2(==l1)][b2][l3(==l1)][b3][l4(==l1)][b4][l5(==l1)]|" 
                    options:NSLayoutFormatAlignAllLeading 
                    metrics:nil 
                    views:viewsDict]; 


    NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[b1]" 
                    options:0 
                    metrics:nil 
                    views:viewsDict]; 


    [self.view addConstraints:constraints]; 
    [self.view addConstraints:constraints2]; 
} 

Aby przestrzenie inny, myślę, że trzeba użyć dłuższą formę wyrażanie ograniczeń, a nie format wizualny. Poniższy kod wydaje się działać dla mnie. Używam tej samej definicji widoków jak powyżej, z tym wyjątkiem, że zmniejszyłem liczbę tytułów do 3 i spacerów do 4, aby dopasować do ciebie pytanie. Względny odstęp powinien być taki, jak w twoim przykładzie, 2: 3: 4: 4.

NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTop relatedBy:0 toItem:viewsDict[@"l1"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b1"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b1"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l2"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l2"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b2"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con5 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b2"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l3"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con6 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l3"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b3"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con7 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b3"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l4"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con8 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l4"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; 
    NSLayoutConstraint *con9 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l2"] attribute:NSLayoutAttributeHeight multiplier:.66 constant:0]; 
    NSLayoutConstraint *con10 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l3"] attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; 
    NSLayoutConstraint *con11 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l4"] attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; 
    NSLayoutConstraint *con12 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b1"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; 
    NSLayoutConstraint *con13 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b2"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; 
    NSLayoutConstraint *con14 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b3"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; 

    NSArray *constraints = @[con1,con2,con3,con4,con5,con6,con7,con8,con9,con10,con11,con12,con13,con14]; 
    [self.view addConstraints:constraints]; 
+0

Świetnie, dzięki za pomysł. Wypróbuję to i zobaczę, czy mogę zhackować coś, co zbliży się do tego, co chcę :) –

+0

Po odrobinie nauki korzystania z Auto Layout udało mi się wykorzystać twój pomysł. Dziękuję Ci! –

+0

Polecenie dla każdego, kto to wypróbuje, sprawdź, czy nie ma żadnych automatycznie dodanych ograniczeń wysokości - ponieważ może to spowodować, że całkowita wysokość będzie większa niż rozmiar ekranu podczas obracania. Jeśli tak, możesz po prostu zmniejszyć ich priorytet do mniejszych ograniczeń wysokości, które chcesz zastosować. –

11

Sztuką jest nie tylko dodać jeden ale dwa ograniczenia między widokami. Jedna z "większa niż lub równa" i jedna z "Mniejsza lub równa". Minimalna wielkość (większym niż lub równy) powinien być odstęp od 3,5" powinny być odstępy na wykazują 4"

Przykład wyświetlacz Maksymalny rozmiar (poniżej lub równy..”:

TOP - 40 punktów - podrzędny 1 - 60 punktów - podrzędny 2 - 80 punktów - podrzędny 3 - 80 punktów - dolny

TOP - SUBVIEW1. Wybierz zarówno w konstruktorze Interface Dodaj ograniczenie "Vertical Odstępy" dwa Ustaw od jednego do większego Następnie lub Równ. 40. Ustaw drugą opcję Mniejszą lub Równą 47.

Suma wszystkich wartości Większe wartości + wszystkie wysokości widoków powinna wynosić 480 pikseli (3.5 ") Suma wszystkich wartości Lesser Then + wszystkich wysokości Twoich widoków powinna wynosić 568 pikseli (4").

+0

Doskonale! W moim przypadku był to SuperView> = 0 do SubView i SubView <= 106 do SuperView – Jacksonkr

Powiązane problemy