risposta

13

No.

Tuttavia, è possibile farlo con formato visivo e una creazione vincolo manuale. Modificare la stringa VFL a:

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

Questo dice che non siete troppo preoccupati per la dimensione effettiva degli spazi tra A e B, e B e C.

Ora, creare un vincolo che fissa il centro di b al centro della superview utilizzando constraintWithItem:... (sto digitando questo messaggio su un telefono, quindi perdonatemi per non aver spiegato l'intero metodo).

Questo, insieme alla spaziatura flessibile, darà anche spazi a sinistra ea destra di b.

+0

Suona grande. Darò un colpo. Grazie! – flohei

+0

Funziona alla grande. Cosi 'semplice. Grazie! :-) – flohei

+0

In che modo "hai fissato il centro di b al centro della superview", @flohei? E non è nemmeno possibile usare il formato visivo per quello o bisogna usare 'constraintWithItem: attribute: relatedBy: toItem: attributo: moltiplicatore: costante:'? –

15

L'Apple Auto Layout Guide suggerisce di utilizzare "viste spaziatore". Ecco la soluzione per il layout del tre viste con spaziatura uguale orizzontalmente:

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

noti che la larghezza spacer1 s' è impostato per essere più di 0. viste distanziatori successivi sono impostati per avere larghezze uguali con spacer1.

+0

C'è qualche ragione per cui non hai semplicemente scritto 'NSDictionary * views = NSDictionaryOfVariableBindings (viewA, viewB, viewC);'? –

+0

Ho modificato la mia risposta per utilizzare più argomenti in NSDictionaryOfVariableBindings. Sto usando un dizionario mutabile in modo da poter aggiungere le mie viste spaziali dinamicamente. –

+0

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

Problemi correlati