Podczas korzystania z automatycznego układu w kodzie ustawienie ramki nic nie daje. Tak więc fakt, że na powyższym widoku określono szerokość 200, nie ma żadnego znaczenia, gdy ustawisz na nim ograniczenia. Aby ograniczenie widoku było jednoznaczne, potrzebne są cztery rzeczy: pozycja x, pozycja y, szerokość i wysokość dla dowolnego stanu.
Obecnie w powyższym kodzie masz tylko dwa (wysokość w stosunku do superview i pozycja y w stosunku do superview). Oprócz tego masz dwa wymagane ograniczenia, które mogą kolidować w zależności od tego, jak są ustawione ograniczenia superview widoku. Jeśli superwiew miałby mieć wymagane ograniczenie, które określa, że jego wysokość będzie mniejsza niż 748, otrzymasz wyjątek „niezaspokojone ograniczenia”.
Fakt, że ustawiłeś szerokość widoku przed ustawieniem ograniczeń, nic nie znaczy. Nie weźmie nawet pod uwagę starej klatki i obliczy nową klatkę na podstawie wszystkich ograniczeń określonych dla tych widoków. Kiedy mam do czynienia z autoukładem w kodzie, zazwyczaj po prostu tworzę nowy widok za pomocą initWithFrame:CGRectZero
lub po prostu init
.
Aby utworzyć zestaw ograniczeń wymagany dla układu, który ustnie opisałeś w swoim pytaniu, musisz dodać pewne ograniczenia poziome, aby ograniczyć szerokość i pozycję x, aby uzyskać w pełni określony układ:
[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)]];
Werbalny opis tego układu brzmi następująco, zaczynając od ograniczenia pionowego:
myView wypełni wysokość swojego superviewu dopełnieniem górnym i dolnym równym przestrzeni standardowej. Nadzór myView ma minimalną wysokość 748 punktów. Szerokość myView wynosi 200 punktów i ma prawe wypełnienie równe standardowej przestrzeni względem jego superview.
Jeśli chciałbyś po prostu, aby widok wypełniał całą wysokość nadzoru bez ograniczania wysokości nadzoru, to po prostu pominiesz (>=748)
parametr w tekście formatu wizualnego. Jeśli myślisz, że (>=748)
parametr jest wymagany do nadania mu wysokości - w tym przypadku tego nie robisz: przypinając widok do krawędzi superwiewu za pomocą składni bar ( |
) lub bar ze spacją ( |-
, -|
), dajesz swojemu widokowi y -pozycja (przypinanie widoku na jednej krawędzi) i pozycja y z wysokością (przypinanie widoku na obu krawędziach), spełniając w ten sposób ograniczenie ustawione dla widoku.
Jeśli chodzi o drugie pytanie:
Używając NSDictionaryOfVariableBindings(self.myView)
(jeśli masz ustawioną właściwość dla myView) i wprowadzając ją do swojego VFL w celu użycia self.myView
w tekście VFL, prawdopodobnie otrzymasz wyjątek, gdy autolayout spróbuje przeanalizować twój tekst VFL. Ma to związek z notacją kropkową w kluczach słownika i systemem próbującym użyć valueForKeyPath:
. Zobacz tutaj podobne pytanie i odpowiedź .