Подтвердить что ты не робот

Как использовать автозапуск на iOS, как я могу указать, что представление должно занимать как можно больше места?

Я использую автозапуск в iOS, чтобы попытаться построить макет с шириной жидкости. Визуальный формат ограничения, который я использую в настоящее время, это:

[self.scrollViewContainer addConstraints:[NSLayoutConstraint 
     constraintsWithVisualFormat:@"H:|-(>=32)-[viewToAdd(<=576)]-(>=32)-|" 
                         options:0 
                         metrics:nil  
                           views:NSDictionaryOfVariableBindings(viewToAdd)
]];

То есть: я хочу минимум 32px-интервала с обеих сторон, и я хочу, чтобы viewToAdd имела максимальную ширину 576px. Это хорошо работает, за исключением того, что я хочу, чтобы viewToAdd использовал любое доступное пространство, все еще удовлетворяя всем ограничениям. В настоящее время я получаю viewToAdd только когда-либо столь же широкий, как и его собственный размер содержимого, а расстояние увеличивается по мере необходимости.

Есть ли способ указать, что viewToAdd должен быть как можно большим?

4b9b3361

Ответ 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.

Ответ 2

Не уверен, что это точно отвечает на вопрос, но для тех, кто использует Storyboard: я обнаружил, что вы можете добавить ограничение ширины и ограничения как для расстояния слева, так и справа от родительского представления. Если вы затем измените ограничение ширины на "< =" вместо "=" и установите приоритет ограничений расстояния (как ведущих, так и конечных) до 750, вид будет максимальным до максимальной ширины, ограничения, если представление слишком мало.

Ограничения на месте