2013-01-07 8 views
8

Se ho una vista nella mia app con 3 subviews (come esempio) con il seguente spaziatura tra di loro:Utilizzando Auto Layout di cambiare spazi altrettanto sul ridimensionamento

TOP - 40 punti - visualizzazione secondaria 1 - 60 punti - SUBVIEW 2 - 80 points - SUBVIEW 3 - 80 points - BOTTOM

Capisco come posso utilizzare il layout automatico per garantire che ciascuna delle mie sottoview mantenga la sua altezza e larghezza, e posso ottenere che tutto sia allineato su un 3.5 o su un OR Schermo da 4 pollici per iPhone.


Ma non riesco a capire che tipo di vincolo che ho bisogno di fare in modo che se fosse allineato per un 3,5" dello schermo, e poi è andato a un 4" schermo, ogni spaziatura aumenterebbe proporzionalmente (ad es. 40 punti andrebbero a 47, da 60 a 71, da 80 a 95 - o giù di lì).

È possibile? O devo rendere uguale la spaziatura tra gli elementi? (Se sì, come sarebbe ho ancora ottenere per ridimensionare altrettanto?)


Sono nuovo di Auto Layout, quindi se ho perso qualcosa fuori, o non l'ho messo in chiaro ciò che significa favore, fammi sapere, grazie.

risposta

1

Non conosco un modo semplice per farlo. Ne ho realizzato uno in cui tutti gli spazi erano uguali, ma per farlo dovevo riempire gli spazi con etichette invisibili (solo etichetta senza titolo). Così, ho avuto i miei 4 oggetti visibili e le 5 "etichette distanziatrici" tutte a posto l'una sull'altra. Ho fatto i 4 oggetti visibili tutti hanno altezze espliciti, ed i distanziali senza altezze fisse, ma destinato ad essere tutti uguali:

-(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]; 
} 

Per rendere gli spazi differenti, io penso che si debba utilizzare il modulo di più esprimere vincoli, piuttosto che il formato visivo. Il codice seguente sembra funzionare per me. Sto usando la stessa definizione delle viste di cui sopra, tranne che ho tagliato il numero di etichette titolate a 3 e distanziali a 4 per corrispondere alla domanda. La spaziatura relativa dovrebbe essere come nel tuo esempio, 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

Grande, grazie per l'idea. Lo proverò e vedrò se riesco a modificare qualcosa che si avvicina a quello che voglio :) –

+0

Dopo aver imparato un po 'come usare il layout automatico, sono riuscito a usare la tua idea. Grazie! –

+0

Un consiglio per chiunque altro provi a controllare, non ci sono vincoli di altezza aggiunti automaticamente, in quanto ciò potrebbe comportare un'altezza complessiva maggiore delle dimensioni dello schermo a rotazione. Se ci sono, puoi semplicemente ridurre la loro priorità a meno dei vincoli di altezza che vuoi applicare. –

11

Il trucco è quello di aggiungere non solo uno, ma due vincoli tra le vostre opinioni. Uno con "Maggiore o uguale a" e uno con "Meno o uguale a". La dimensione minima (maggiore di o uguale) dovrebbe essere la spaziatura sul 3.5" dovrebbe essere la spaziatura sul display 4"

Esempio visualizzazione La dimensione massima (pari o inferiore.":.

TOP - 40 punti - visualizzazione secondaria 1 - 60 punti - visualizzazione secondaria 2 - 80 punti - visualizzazione secondaria 3 - 80 punti - FONDO

TOP - SUBVIEW1:. Selezionare sia in Interface Builder Aggiungere il vincolo "spaziatura verticale" due Impostare uno su maggiore Quindi o Uguale a 40. Impostare l'altro su Minore Allora o Uguale 47.

La somma di tutti i valori di Maggiore Poi + tutte le altezze delle proprie visualizzazioni deve essere di 480 pixel (3.5 ") La somma di tutti i valori Lesser Then + tutte le altezze delle tue visualizzazioni dovrebbe essere 568 pixel (4")

+0

Eccellente! Nel mio caso era SuperView> = 0 a SubView e SubView <= 106 a SuperView – Jacksonkr

Problemi correlati