2013-01-12 13 views
48

Suppongo che debbano riferirsi al modello di molle e montanti ma non riesco a trovarne alcuna menzione. Quando si dispone del vincolo NSLog, a volte vengono visualizzati come stringa descrittiva della classe non documentata NSAutoresizingMaskLayoutConstraint. Ho notato almeno 3 diversi tipi: h=---, h=--&, h=-&- con versione orizzontale e verticale.Quando si esegue il debug dell'autolayout qual è il significato delle stringhe della maschera di autoresizzazione come h = - & v = - & -?

Si presentano molto quando si esegue il debug su layout vincolati.

+0

Sperimentando su questo in 10.7.5, ho riscontrato che NSAMLC sembra non apprezzare alcun attributo ma Larghezza e Altezza. Prova a creare un NSAMLC per, per esempio, a sinistra o in basso, e ti farà un'eccezione. Le altre cose che ho provato sono disuguaglianze, moltiplicazioni e aggiunte, e niente ha funzionato: non ho potuto ottenere un singolo NSAMLC che si descriveva con una e commerciale. Quindi, considera la mia curiosità colpita. –

+0

Wow sei andato abbastanza in profondità, contento che ti sia divertito l'hacking! Mi sono arreso. Ho pensato che la conoscenza di ciò che questo avrebbe aiutato il mio debug, ma in realtà non lo è. Questi errori si manifestano solo quando si dispone di un layout con vincoli eccessivi, ovvero una superview impone la sua maschera autoresizing sul proprio layout (già) completamente vincolato, diventando così vincolato. Se li vedi normalmente significa che devi impostare translatesAutoresizingMaskIntoConstraints = NO. –

+0

Quali errori? Non hai menzionato alcun errore nella tua domanda. –

risposta

99

Se si specificano le maschere di autoresizzazione anziché i vincoli o non si specifica alcun vincolo, la vista avrà i vincoli NSAutoResizingMaskLayoutConstraint rispetto a NSLayoutConstraints. Se si imposta translatesAutoresizingMaskIntoConstraints su NO, questi vincoli non vengono visualizzati. Non è possibile combinare e abbinare su una singola vista o si ottengono errori di vincolo insoddisfacenti.

Ho impostato un progetto di test rapido con varie combinazioni di maschere autoresizing e il formato di registrazione è piuttosto semplice.

  • h= o v= indica che stiamo parlando di contorni in direzione orizzontale o verticale.
  • - indica una dimensione fissa
  • & indica un formato flessibile
  • L'ordine dei simboli rappresenta margine, dimensione, margine

Pertanto, h=&-& significa avere margini sinistro e destro flessibili e una larghezza fissa , v=-&- significa margini superiori e inferiori fissi e altezza flessibile, e così via.

+3

come su "v = - &"? Sarebbe fissato il gap superiore, l'altezza fissa, il divario inferiore flessibile? –

+0

Sì, esattamente. Non mi preoccupai di elencare tutte le possibili combinazioni :) – jrturton

+0

nessun fastidio volevo solo controllare di averlo capito. Grazie –

3

Se si guarda il video del WWDC 2012 sulle best practice per il mastering del layout automatico, è presente una sezione in cui il relatore menziona che questa è la sintassi per le viste che utilizzano le maschere di ridimensionamento automatico e i vincoli NOT. Non esiste un formato visivo associato a questi elementi come per NSLayoutConstraint.

+0

non pensare che la domanda si riferisca al formato visivo. Si tratta di interpretare le eccezioni della console –

3

In aggiunta alla risposta di jrturton, le informazioni migliori che ho trovato per comprendere le descrizioni dei vincoli sono la documentazione del linguaggio di Visual Format che è necessario creare vincoli nel codice. La lingua è documentata come una grammatica formale, quindi potrebbe richiedere un minuto per assorbire tutto.

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/VisualFormatLanguage/VisualFormatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3-SW1

vi faccia un esempio:

<NSLayoutConstraint:0x10ada8a70 H:|-(44)-[UIButton:0x10ac5dc30] (Names: '|':UIView:0x10ac60470)> 

Questo è un vincolo Orientamento orizzontale (H:) Il collegamento è di 44 pixel da un superview (|) ad un UIButton Il superview denominato è un UIView (nomi: '|': UIView:) - importante sapere perché non è necessario essere vincolati dall'immedi ha mangiato superview

I valori esadecimali sono tutti indirizzi validi degli elementi dell'interfaccia utente. Quando si interrompe il breakpoint su tutte le eccezioni e si mette in pausa sul conflitto di vincoli, è possibile utilizzare l'indirizzo po per visualizzare l'oggetto del vincolo.Nel mio caso:

(lldb) po 0x10ac5dc30 
<UIButton: 0x10ac5dc30; frame = (44 199; 30 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x10ac5ddf0>> 

(lldb) po 0x10ac60470 
<UIView: 0x10ac60470; frame = (0 64; 320 504); autoresize = RM+BM; animations = { position=<CABasicAnimation: 0x10ac5ec70>; bounds=<CABasicAnimation: 0x10ac62250>; }; layer = <CALayer: 0x10ac60530>> 
Problemi correlati