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

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

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

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

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


person simon    schedule 30.10.2012    source источник


Ответы (2)


Вам нужно будет указать дополнительные ограничения для представления, чтобы заставить его изменить размер представления, чтобы заполнить оставшееся доступное пространство. В настоящее время вы устанавливаете минимумы и максимумы представления, но не устанавливаете никаких конкретных ограничений, чтобы дать автомакету более полное решение. В дополнение к верхней границе ширины вам нужно дать ему 1. отправную точку для определения ширины представления, либо явно задав ширину с более низким приоритетом, либо 2. увеличив расстояние с обеих сторон. жесткие ограничения.

Основываясь на том, что вы описали, вам нужно ограничить свое представление, чтобы дать ему более существенные привязки к суперпредставлению с обеих сторон, чтобы позволить системе решить ширину. Поскольку вы хотели бы, чтобы сам размер представления основывался на размере его контейнера, вам нужно будет изменить ограничения интервалов (вариант 2 сверху). В приведенном выше примере вы указали только минимальное расстояние, что приведет к тому, что любое из следующих решений ограничения будет признано действительным механизмом автомакета для суперпредставления 400pt:

|-32pt-[20pt]-------348pt-| <-- autolayout will probably choose this one
|-100pt----[20pt]---280pt-|
|-50pt--[20pt-]-----330pt-|

Что, вероятно, не то, что вы хотите. Более того, ширина представления может быть любой между 0-576pt, что также, вероятно, не то, что вам нужно. Поскольку автомакет не знает, чего вы хотите, он просто использует intrinsicContentSize представления для конкретных ограничений по размеру. Поскольку вы выбрали 32 pt в качестве интервала, первым шагом будет дать ограничениям интервалов более существенные инструкции, а именно сообщить системе, что интервал должен составлять 32 pt между краями представления и суперпредставлением. если ширина представления не превышает 576 pts. Вы бы сделали это так в своей строке VFL:

"H:|-(>=32,==32@900)-[viewToAdd(<=576)]-(>=32,==32@900)-|"

В нем говорится: "viewToAdd должен иметь максимальную ширину 576 pts и иметь отступ между собой и суперпредставлением 32 pts. Если размер суперпредставления превышает максимальную ширину viewToAdd плюс начальное заполнение 64 pts, заполнение с обеих сторон должно увеличиваться, чтобы продолжать решать набор ограничений».

Это приводит к тому, что следующие ограничения являются правильными для суперпредставления 400pt:

|-32pt--[336pt]--32pt-|

Если вы хотите, чтобы viewToAdd оставался в центре своего суперпредставления, когда представление превышает максимальное значение, вам нужно будет передать параметр NSLayoutFormatAlignAllCenterX в параметр options в [NSLayoutConstraint -constraintsWithVisualFormat:]. Если вы не установили ограничение >=32 для заполнения или не установили приоритет ниже 1000 ("обязательный" уровень приоритета ограничения) для ограничения ==32 вашего заполнения, тогда ваш супервизор не сможет вырасти за пределы 640pts.

person larsacus    schedule 30.10.2012
comment
Также кажется, что я, возможно, был не прав, говоря, что вы можете просто передать параметр NSLayoutFormatAlignAllCenterX в визуальный формат и сделать так, чтобы он центрировал представление в суперпредставлении. Параметры будут применяться только к представлениям, на которые вы явно ссылаетесь в строке визуального формата. Таким образом, похоже, вам нужно будет иметь другое явное ограничение, которое ограничивает центр представления центром суперпредставления. - person larsacus; 31.10.2012
comment
Да, спасибо - на самом деле я уже центрировал его в отдельном ограничении: [self.scrollViewContainer addConstraint:[NSLayoutConstraint constraintWithItem:viewToAdd attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.scrollViewContainer attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; - person simon; 31.10.2012

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

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

person Tum    schedule 28.02.2016