Ответ 1
Вам нужно будет указать дополнительные ограничения для представления, чтобы получить его, чтобы размер представления заполнил оставшееся свободное пространство. В настоящее время вы устанавливаете минимальные значения и максимумы представления, но не устанавливаете никаких конкретных ограничений, чтобы дать автозапуск более полному решению. В дополнение к верхней границе ширины вам нужно дать ей 1. начальную точку, чтобы решить ширину представления, либо явно указывая на нее ширину с более низким приоритетом, либо 2. дать расстояние с обеих сторон еще немного жесткие ограничения.
Основываясь на том, что вы описали, вам нужно ограничить свое представление, чтобы придать ему более существенные привязки к супервизору с обеих сторон, чтобы система разрешала ширину. Поскольку вы хотите, чтобы сам размер представления основывался на его размере контейнера, вам нужно будет изменить ограничения расстояния (вариант 2 сверху). В приведенном выше примере вы указали только минимальный интервал, который приведет к тому, что любое из следующих решений ограничения будет найдено как действительное для механизма автозапуска для 400pt супервизора:
|-32pt-[20pt]-------348pt-| <-- autolayout will probably choose this one
|-100pt----[20pt]---280pt-|
|-50pt--[20pt-]-----330pt-|
Скорее всего, это не то, что вы хотите. Тем не менее, ширина представления может быть чем-то между 0-576pt, что также, вероятно, не то, что вы хотите. Поскольку автозапуск не знает, чего вы хотите, он просто использует intrinsicContentSize
для вида для конкретных ограничений размеров. Поскольку вы выбрали 32pt в качестве интервала, первым шагом было бы дать ограничениям расстояния более существенным инструкциям, а именно, сообщая системе, что интервал должен составлять 32pts между краями представления и супервизора, если ширина представления не равна > 576pts. Вы бы сделали это так в своей строке VFL:
"H:|-(>=32,[email protected])-[viewToAdd(<=576)]-(>=32,[email protected])-|"
Это говорит: "viewToAdd
должна иметь максимальную ширину 576pts и иметь отступы между собой и супервидом 32pts. Если размер супервизора растет за максимальную ширину viewToAdd
плюс начальное заполнение 64pts, прокладка с обеих сторон должна расти, чтобы продолжить решение набора ограничений".
Это приводит к тому, что следующие ограничения правильны для супервизора 400pt:
|-32pt--[336pt]--32pt-|
Если вы хотите, чтобы viewToAdd
оставался центрированным в нем надстройкой, когда представление растет выше максимума, вам нужно передать опцию NSLayoutFormatAlignAllCenterX
параметру options
в [NSLayoutConstraint -constraintsWithVisualFormat:]
. Если у вас не было ограничения на ограничение >=32
в дополнении или не было установлено приоритет ниже 1000 ( "требуемый" уровень приоритета ограничения) на вашем дополнении ==32
, тогда ваш супервизор не сможет вырасти выше 640pts.