Kodda Otomatik Yerleşim kullanılırken çerçevenin ayarlanması hiçbir şey yapmaz. Dolayısıyla, yukarıdaki görünümde 200'lük bir genişlik belirlemiş olmanız, üzerinde kısıtlamalar koyduğunuzda hiçbir şey ifade etmez. Bir görünümün kısıtlama kümesinin belirsiz olmaması için dört şeye ihtiyacı vardır: herhangi bir durum için bir x konumu, bir y konumu, bir genişlik ve bir yükseklik.
Şu anda yukarıdaki kodda, yalnızca iki tane var (süpervizöre göre yükseklik, denetime göre ve y konumu). Buna ek olarak, görünümün denetleme kısıtlamalarının nasıl ayarlandığına bağlı olarak çakışabilecek iki gerekli kısıtlamaya sahipsiniz. Eğer Superview belirtir 's yükseklik 748 den bazı değer daha az olması gerekli bir kısıtlamasını olması idi, bir "edilemezdir kısıtlamalar" istisna alacak.
Kısıtlamalar belirlemeden önce görünümün genişliğini ayarlamış olmanız hiçbir şey ifade etmez. Hatta eski çerçeveyi hesaba katmayacak ve bu görünümler için belirlediği tüm kısıtlamalara dayalı olarak yeni bir çerçeve hesaplayacaktır. Kodda otomatik düzen ile uğraşırken, genellikle kullanarak initWithFrame:CGRectZero
veya basitçe kullanarak yeni bir görünüm oluştururum init
.
Sorunuzda sözlü olarak tanımladığınız düzen için gerekli olan kısıtlama kümesini oluşturmak için, tam olarak belirlenmiş bir düzen vermek üzere genişliği ve x konumunu sınırlandırmak için bazı yatay sınırlamalar eklemeniz gerekir:
[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)]];
Bu düzeni sözlü olarak açıklamak, dikey kısıtlamadan başlayarak aşağıdaki gibidir:
myView, süpervizörün yüksekliğini standart alana eşit bir üst ve alt dolgu ile doldurur. myView'ın süpervizör görüntülemesinin minimum yüksekliği 748 puntodur. myView'ın genişliği 200 puntodur ve denetime göre standart alana eşit bir sağ dolgusu vardır.
Sadece görünümün, süpervizörün yüksekliğini sınırlamadan tüm süpervizyon yüksekliğini doldurmasını istiyorsanız, o zaman sadece (>=748)
görsel format metnindeki parametreyi çıkarırsınız . (>=748)
Parametrenin ona bir yükseklik vermek için gerekli olduğunu düşünüyorsanız - bu durumda yapmazsınız: görünümü |
, boşluk ( |-
, -|
) sözdizimi içeren çubuğu ( ) veya çubuğu kullanarak süpervizörün kenarlarına sabitlemek, görünümünüze bir y vermiş olursunuz. -konum (görünümü tek kenara sabitleme) ve yüksekliği olan bir y-konumu (görünümü her iki kenara sabitleme), böylece görünüm için kısıtlama kümenizi karşılar.
İkinci sorunuzla ilgili olarak:
Kullanarak NSDictionaryOfVariableBindings(self.myView)
(myView için bir özellik kurulumunuz varsa) ve bunu self.myView
VFL metninizde kullanmak üzere VFL'nize besleyin, otomatik düzen VFL metninizi ayrıştırmaya çalıştığında muhtemelen bir istisna alırsınız. Bunun sözlük tuşlarındaki nokta notasyonu ve kullanmaya çalıştığı sistemle ilgisi vardır valueForKeyPath:
. Benzer bir soru ve cevap için buraya bakın .