Quando si utilizza Layout automatico nel codice, l'impostazione della cornice non ha effetto. Quindi il fatto che tu abbia specificato una larghezza di 200 nella vista sopra, non significa nulla quando imposti dei vincoli su di essa. Affinché un set di vincoli di visualizzazione sia univoco, ha bisogno di quattro cose: una posizione x, una posizione y, una larghezza e un'altezza per ogni stato dato.
Attualmente nel codice sopra, ne hai solo due (altezza, relativa alla superview e posizione y, rispetto alla superview). Oltre a questo, hai due vincoli obbligatori che potrebbero entrare in conflitto a seconda di come sono impostati i vincoli della superview della vista. Se la superview dovesse avere un vincolo obbligatorio che specifica che l'altezza deve essere un valore inferiore a 748, si otterrà un'eccezione "vincoli insoddisfacenti".
Il fatto che tu abbia impostato la larghezza della vista prima di impostare i vincoli non significa nulla. Non terrà nemmeno in considerazione il vecchio frame e calcolerà un nuovo frame in base a tutti i vincoli che ha specificato per quelle viste. Quando si ha a che fare con il layout automatico nel codice, in genere creo solo una nuova vista usando initWithFrame:CGRectZero
o semplicemente init
.
Per creare il set di vincoli richiesto per il layout che hai descritto verbalmente nella tua domanda, dovresti aggiungere alcuni vincoli orizzontali per delimitare la larghezza e la posizione x in modo da fornire un layout completamente specificato:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
La descrizione verbale di questo layout si legge come segue a partire dal vincolo verticale:
myView riempirà l'altezza della sua superview con un'imbottitura superiore e inferiore uguale allo spazio standard. La superview di myView ha un'altezza minima di 748 punti. La larghezza di myView è di 200 punti e ha un riempimento destro uguale allo spazio standard rispetto alla sua superview.
Se desideri semplicemente che la vista riempia l'intera altezza della superview senza vincolare l'altezza della superview, ometti semplicemente il (>=748)
parametro nel testo in formato visivo. Se pensi che il (>=748)
parametro sia necessario per dargli un'altezza - in questo caso non lo fai: fissando la vista ai bordi della superview usando la sintassi barra ( |
) o barra con spazio ( |-
, -|
), stai dando alla tua vista una y -posizione (bloccando la vista su un bordo singolo) e una posizione y con altezza (bloccando la vista su entrambi i bordi), soddisfacendo così il vincolo impostato per la vista.
Riguardo alla tua seconda domanda:
Usando NSDictionaryOfVariableBindings(self.myView)
(se avevi una configurazione di proprietà per myView) e inserendola nel tuo VFL da usareself.myView
nel tuo testo VFL, probabilmente otterrai un'eccezione quando il layout automatico tenta di analizzare il tuo testo VFL. Ha a che fare con la notazione del punto nelle chiavi del dizionario e il sistema che cerca di utilizzare valueForKeyPath:
. Vedi qui per una domanda e una risposta simili .