Изменения представления стека в iOS 15
Stack View Fill Distribution
Одна из вещей, которая всегда раздражала меня в представлениях стека, - это недокументированное и неожиданное поведение. Взгляните на этот пример. У меня есть многострочная метка и переключатель в виде горизонтального стека.
Stack view использует распределение заливки и выравнивание по центру. При распределении заливки Stack view растягивается или сжимается, чтобы заполнить доступную ширину. Автоматическая компоновка решает, какой вид сжать первым, сравнивая приоритеты сопротивления сжатию содержимого. Вид с самым низким приоритетом будет сжат.
Поскольку и метка, и переключатель имеют приоритет горизонтального сопротивления сжатию по умолчанию 750, эта компоновка должна быть неоднозначной. Используя Xcode 13, Interface Builder действительно сообщает о проблеме с отсутствующими ограничениями:
Interface Builder здесь вводит в заблуждение. Проблема не в отсутствии ограничений. Я хочу сжать этикетку перед переключателем, поэтому мне нужно снизить приоритет сопротивления сжатию этикетки до 749:
Это здорово, работает так, как я ожидал, так в чем проблема? Вот как это выглядит, если я использую тот же макет на iOS 14 (или более ранней версии) по сравнению с iOS 15:
Running on iOS 14 the label and the switch are both sized to half the available width. Lowering the priority to 749 has not had the expected effect.
Disambiguation Constraints
Вот как ограничения выглядят в отладчике представления при работе на iOS 14.5. Ограничение UISV-text-width-disambiguation вызывает непредвиденное поведение. Он имеет приоритет 759 и хочет сделать ширину метки равной половине ширины представления стека:
Переключатель имеет приоритеты объятий и сжатия 750, ограничение разрешения имеет приоритет.. Вот как выглядят ограничения для одного и того же макета на iOS 15:
Одно из решений заключается в увеличении приоритета перехода к контенту до 760 или выше.