Использование Auto Layout, чтобы UILabel и UITextField были рядом друг с другом

Я пытаюсь расположить ярлык экземпляра UILabel рядом с текстовым полем экземпляра UITextField, как это было сделано в диалогах настроек iOS. Я использую Auto Layout и ограничения с помощью расширений FLKAutoLayout Флориана Куглерса ( https://github.com/dkduck/FLKAutoLayout).

Когда я устанавливаю только ведущее ограничение для метки и ограничение пространства между меткой и текстовым полем, ширина метки и текстового поля корректируется в соответствии с их содержимым. (нижняя картинка)

Но когда я устанавливаю также конечное ограничение для текстового поля, только ширина текстовых полей подстраивается под его содержимое, но метка растягивается. (верхняя картинка)

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

[self addSubview:self.label];
[self addSubview:self.textField];

[self.label alignLeadingEdgeWithView:self predicate:@"10"];
[self.textField constrainLeadingSpaceToView:self.label predicate:@"10"];

// difference between top and bottom pciture
// [self.textField alignTrailingEdgeWithView:self predicate:@"-25"];

2 ответа

Решение

ИЗДАНО: Итак, после комментария Рахула я играл с широтой и приоритетами. Добавление следующего ограничения ширины приводит к несколько неправильному направлению, так как при вводе очень длинного значения размер метки был слишком мал.

[self.label constrainWidth:@"0@1"];

Поэтому я, наконец, прочитал "Устойчивость к сжатию и контентное объятие" ( http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html), и решение состоит в том, чтобы установить приоритет горизонтального контента: метка для более высокого значения.

[self.label setContentHuggingPriority:500 forAxis:UILayoutConstraintAxisHorizontal];

Тогда даже ввод больших значений позволит метке оставаться такой же ширины, как и ее содержимое!

Решение заключается не в добавлении ограничения ширины с приоритетом, а в том, чтобы установить свойства Resistance Resistance и Content Hugging для внутреннего размера содержимого UIViews.

Следующие ограничения, которые я установил в раскадровке, работают именно так, как вы хотите.

  • Горизонтальное ограничение пространства между меткой и суперпредставлением.(По умолчанию)
  • Горизонтальное ограничение пространства между текстовым полем и суперпредставлением.(дефолт)
  • Горизонтальное ограничение пространства между текстовым полем и меткой.
Другие вопросы по тегам