При использовании Auto Layout в коде установка рамки ничего не делает. Таким образом, тот факт, что вы указали ширину 200 в представлении выше, ничего не значит, когда вы устанавливаете для него ограничения. Чтобы набор ограничений представления был однозначным, ему нужны четыре вещи: позиция по оси x, позиция по оси y, ширина и высота для любого заданного состояния.
В настоящее время в приведенном выше коде у вас есть только два (высота относительно супервизора и y-позиция относительно супервизора). В дополнение к этому у вас есть два обязательных ограничения, которые могут конфликтовать в зависимости от того, как установлены ограничения супервизора представления. Если суперпредставление должно иметь обязательное ограничение, указывающее, что его высота будет некоторым значением меньше 748, вы получите исключение «невыполнимые ограничения».
Тот факт, что вы установили ширину представления перед установкой ограничений, ничего не значит. Он даже не будет принимать во внимание старый фрейм и вычислит новый фрейм на основе всех ограничений, которые он указал для этих представлений. Имея дело с автоматическим размещением в коде, я обычно просто создаю новое представление, используя initWithFrame:CGRectZero
или просто init
.
Чтобы создать набор ограничений, необходимый для макета, который вы устно описали в своем вопросе, вам нужно будет добавить несколько горизонтальных ограничений, чтобы ограничить ширину и положение по оси x, чтобы получить полностью определенный макет:
[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)]];
Устное описание этого макета звучит следующим образом, начиная с ограничения по вертикали:
myView заполнит высоту своего супервизора верхним и нижним отступом, равным стандартному пространству. Минимальная высота супервизора myView составляет 748 точек. Ширина myView составляет 200 точек и имеет правое заполнение, равное стандартному пространству для его супервизора.
Если вы просто хотите, чтобы представление заполняло всю высоту супервизора без ограничения высоты супервизора, то вы просто опустите (>=748)
параметр в тексте визуального формата. Если вы считаете, что (>=748)
параметр необходим для присвоения ему высоты - в данном случае вы этого не делаете: закрепляя представление на краях супервизора с помощью синтаксиса bar ( |
) или bar с пробелом ( |-
, -|
), вы даете своему представлению y -position (закрепление вида на одном краю) и y-положение с высотой (закрепление вида на обоих краях), таким образом удовлетворяя ваши ограничения, установленные для вида.
Что касается вашего второго вопроса:
Используя NSDictionaryOfVariableBindings(self.myView)
(если у вас была настройка свойств для myView) и вводя это в ваш VFL для использования self.myView
в вашем тексте VFL, вы, вероятно, получите исключение, когда autolayout попытается проанализировать ваш текст VFL. Это связано с точечной нотацией в ключах словаря и системой, которую пытается использовать valueForKeyPath:
. См. Здесь аналогичный вопрос и ответ .