2016-04-21 2 views
0

У меня есть макет, который я хочу, чтобы выглядеть следующим образом:IOS Autolayout же ширины ограничение

Location: "blabla" 
Website:  "blabla" 
LongerLabel: "blabla" 

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

@"H:|[locationLabel(80)]-5-[location]|" 
@"H:|[websiteLabel(80)]-5-[website]|" 
@"H:|[remarksLabel(80)]-5-[remarks]|" 

Я уже пробовал это, используя циклическую ссылку, которая не работает;)

@"H:|[locationLabel(websiteLabel)]-5-[location]|" 
@"H:|[websiteLabel(remarksLabel)]-5-[website]|" 
@"H:|[remarksLabel(locationLabel)]-5-[remarks]|" 

Я не хочу, чтобы мои метки должны быть зашиты до 80, но Я хочу, чтобы они имели одинаковую ширину в соответствии с максимальным размером собственного содержимого.

+0

Попробуйте, как это '@ "H: | [locationLabel (== websiteLabel)] - 5- [место] |"' – Gandalf

+0

Пробовали, документы говорят, что они необязательно в этом случае, и это не сработало тот же результат, что и без – Haagenti

+0

ooops, пропустил очко. Это не будет работать, если вы не укажете ширину по крайней мере одного конкретного элемента в горизонтальном направлении. Скажем, «locationLabel» и «location» распространяются по всему экрану по горизонтали. Теперь система не знает, что каждая из них имеет ширину. 'locationLabel' может быть равна ширине' websiteLabel' или 'remarksLabel', но не имеет разрешаемой ширины во время выполнения. Поэтому либо решите, что как «locationLabel», так и «location» также будут иметь одинаковую ширину или какое-либо конкретное отношение, или при условии, что любая из них имеет фиксированную ширину. Это должно решить. – Gandalf

ответ

2

Вы можете сделать это с помощью кругового Greater-чем или равной ширине ограничений:

@"H:|[locationLabel(>=websiteLabel)]-5-[location]|" 
@"H:|[websiteLabel(>=remarksLabel)]-5-[website]|" 
@"H:|[remarksLabel(>=locationLabel)]-5-[remarks]|" 

Labels with applied constraints

(извините за странные цвета :))

UPDATE: Я «Мы просто проверили простые« равные »круговые ограничения, и они работают и в моем случае. Тем не менее, я думаю, что «равные» ограничения не указывают «основной» ярлык каким-либо образом, они просто указывают, что метки должны быть равны. И если все они равны наименьшей метке, это тоже прекрасно. Поэтому в «равном» случае это, вероятно, зависит от порядка ограничений.

Теперь давайте рассмотрим две гипотетические метки («Ярлык» и «Метка ярлыка» (LL для краткости)), которые связаны с помощью ограничений «> =».

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

Механизм автоотключения (AE) берет первый ярлык и делает его как можно меньшим из-за обнимания содержимого. На данный момент LL игнорируется. Затем AE берет вторую метку. В случае равных ограничений он должен был бы сделать его коротким, как и первые метки, потому что первая метка уже обработана. Но в случае ограничения «> =» AE может сделать вторую метку более длинной. Однако теперь это влияет на ограничение «L> = LL», и AE должен вернуться к L и обработать его еще раз, используя новые данные (в случае ограничения «==» это остановится уже, потому что не возникло конфликтов) , Единственное решение теперь состоит в том, чтобы сделать первый ярлык длиннее, что делает AE, потому что он не вносит никаких конфликтов.

Таким образом, в нескольких итерациях AE заканчивается тем, что все метки имеют одинаковую ширину (ширину самой длинной метки).

+0

Ммм это работает. Я знаю немного о VFL, но я не знаю, почему это работает, а не моя круговая ссылка;). Я дам вам правильный ответ, но если бы у вас была свободная минута, вы могли бы объяснить, почему ваш ответ работает? Постскриптум цвета прекрасны и улучшают ваш ответ;)! – Haagenti

+0

@ScareCrow, я добавил свое видение, почему это работает) – FreeNickname

+0

Хороший ответ !!! - Я думаю, что это работает, если вы опустите последнее ограничение, я не пробовал, но кажется, что последние ограничения не требуются, не так ли? – Kampai

0

Да, вы можете указать фиксированные ограничения ширины с использованием языка визуального форматирования.

Ограничение будет, как показано ниже:

@"H:|[locationLabel]-5-[location]|" 
@"H:|[websiteLabel]-5-[website]|" 
@"H:|[remarksLabel]-5-[remarks]|" 

Ниже дополнительные ограничения требуется:

// Width constraints for Left side labels 
NSLayoutConstraint *locationLabelConstraint = [NSLayoutConstraint constraintWithItem:locationLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.6 constant:0]; 
[self.view addConstraint:locationLabelConstraint]; 

NSLayoutConstraint *websiteLabelConstraint = [NSLayoutConstraint constraintWithItem:locationLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.6 constant:0]; 
[self.view addConstraint:locationLabelConstraint]; 

NSLayoutConstraint *remarksLabelConstraint = [NSLayoutConstraint constraintWithItem:locationLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.6 constant:0]; 
[self.view addConstraint:remarksLabelConstraint]; 


// Width constraints for right side labels 
NSLayoutConstraint *locationConstraint = [NSLayoutConstraint constraintWithItem:locationLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.3 constant:0]; 
[self.view addConstraint:locationConstraint]; 

NSLayoutConstraint *websiteConstraint = [NSLayoutConstraint constraintWithItem:locationLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.3 constant:0]; 
[self.view addConstraint:websiteConstraint]; 

NSLayoutConstraint *remarksLabelConstraint = [NSLayoutConstraint constraintWithItem:locationLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.3 constant:0]; 
[self.view addConstraint:remarksConstraint]; 

Пояснение:

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

Мультипликатор = 1 => ширина Полный вид

Мультипликатор = 0,5 => Половина вид ширина

соблюдать левую боковую ширину этикетки ограничение, где множитель = 0.6, что означает, что он будет принимать 0.6% площадь self.view ширина.

То же самое правостороннее обозначение ширины метки умножителя = 0.3 которое принимает 0.3% площади self.view. Измените эти значения в качестве удобства.

Примечание: Также, пожалуйста, проверьте консоль Xcode, иногда там ограничения дают предупреждения о конфликте ограничений. Если есть какие-либо предупреждения, пожалуйста, разрешите, изменив свойства ограничений.

+1

Но это означает, что значение жестко закодировано до 0.6 родительского. Это не то, что я хочу. Тогда я лучше с жестко заданными значениями. Проверьте мой вопрос для более глубокого объяснения. – Haagenti

0

Не уверен, что мне что-то не хватает, но простых ограничений «равной ширины» должно быть достаточно (нет необходимости в> =). Они сделали для меня.

По умолчанию приоритет сопротивления сжатию (750) больше, чем приоритет обхода содержимого по умолчанию (250). Так что все это кончается. enter image description here

+0

Я согласен, что он должен работать. И я также задавался вопросом о приоритетах. Однако ОП прямо заявил в вопросе, что это решение почему-то не сработало для него, и я считаю, что в прошлом я столкнулся с аналогичной проблемой. Следовательно, «> =» трюк. Справедливости ради, я не мог воспроизвести ситуацию, когда «==» не работает. Но я считаю, что такая ситуация действительно может существовать. – FreeNickname