2015-01-27 7 views
6

Se utilizzo una tabellaView come subView della vista in xib. E il TableView è completamente coperto dalla vista. ma nell'attributo del xib, posso vedere i due vincoli verticali appena aggiunti: il primo vincolo usa il primo di tableView come primo elemento, il primo di superView come secondo elemento, ma nel secondo vincolo mostra che il fondo di superview era il primo elemento, e il il fondo di tableView era il secondo oggetto. qual è il motivo per cui lo xib decide di utilizzare chi come primo elemento & secondo elemento.Come comprendere il primo elemento del vincolo di layout automatico e il secondo elemento?

risposta

14

Tutti i vincoli esprimono una formula del tipo: (. La relazione potrebbe essere <= o >=, troppo)

firstItem.firstItemAttribute == secondItem.secondItemAttribute * multiplier + constant 

Il più delle volte, il moltiplicatore è 1, in modo goccia che:

firstItem.firstItemAttribute == secondItem.secondItemAttribute + constant 

In genere è più semplice pensare in termini di costanti positive. Quindi, qualcosa del tipo:

view.Top == superview.Top + 20 

ha senso. La parte superiore della vista è di 20 punti sotto la parte superiore della superview. (Nel sistema di coordinate utilizzato dal layout automatico, Y aumenta verso il basso, quindi l'aggiunta di 20 punti indica una posizione "sotto".)

È possibile cambiare gli articoli in giro, ma, se si desidera la stessa relazione, è necessario per annullare la costante:

superview.Top == view.Top + -20 

Questo -20 può rendere più difficile da capire. A proposito, Xcode scambierà felicemente i due oggetti e annullerà la costante per te. (Se il moltiplicatore non fosse 1, la matematica diventa un po 'più complicata, ma è ancora possibile.)

Se dovessi semplicemente scambiare gli elementi intorno ma non annullare la costante, si esprimerebbe una relazione diversa:

superview.Top == view.Top + 20 

Ciò significherebbe che la parte superiore della superview sarebbe sotto la parte superiore della vista. O, piuttosto, che la vista sarebbe posizionata sopra la parte superiore della superview e che la parte superiore sarebbe ritagliata.

Ora, i vincoli sull'altro capo sono più spesso espressi con voci nell'altro ordine perché di solito si desidera che la relazione sia l'opposto. Cioè, vuoi che la parte superiore della vista sia al di sotto della parte superiore della superview, ma vuoi che il fondo della vista sia sopra il il fondo della superview. Quindi, la costante è positiva solo quando si organizzano gli articoli nell'altro ordine:

superview.Bottom == view.Bottom + 20 
+0

Grande spiegazione, per quanto riguarda le spaziature orizzontali? Ha un valore predefinito di -16, 'view.leading = superview.leading margin - 16', sembra non essere la natura. – gabbler

+0

thx, ho pensato che la formula "firstItem.firstItemAttribute == secondItem.secondItemAttribute * moltiplicatore + costante" è utilizzata per calcolare il primo frame dell'oggetto in base al frame di secondItem. Quindi questa formula non avrà nulla a che fare con il calcolo del frame di secondItem, vero? – ximmyxiao

+0

@gabbler: Orizzontale funziona in modo simile a quello verticale: L'interlinea è analoga a Superiore e il Trailing è analogo a Inferiore (poiché il sistema di coordinate aumenta da Principale/Superiore a Trailing/Bottom). Non ho familiarità con iOS e le cose marginali. Se il lato iniziale di una vista deve essere verso Trailing (di solito verso destra) dal Leading della superview, in genere sarà 'view.Leading == superview.Leading + N'.Tuttavia, se esprimi la stessa posizione rispetto a un margine, sarebbe 'view.Leading = superview.Leading margin + (N - margin width)'. Potrebbe essere che '(N - width margin)' è negativo. –

Problemi correlati