Использование UIStackView для центрирования единого представления

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

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

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

Я хотел бы понять, почему UIStackView так себя ведет.


person Robert Wijas    schedule 19.07.2015    source источник
comment
да. Я не понимаю, почему это переопределяет внутренний размер контента, даже если я установил высокий приоритет захвата контента.   -  person Robert Wijas    schedule 20.07.2015


Ответы (1)


UIStackView создает ограничения с приоритетом 1000 (максимально допустимый приоритет), который равен UILayoutPriorityRequired. Для удовлетворения этих ограничений, если это возможно, требуется автоматический макет.

Ваше ограничение с «высоким» приоритетом (UILayoutPriorityDefaultHigh == 750, я полагаю) конфликтует с необходимыми ограничениями представления стека, поэтому автоматическая компоновка проигнорирует ваше ограничение.

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

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

Непонятно, почему вы пытаетесь использовать представление стека для центрирования представления. Если у вас есть только одно представление и вы хотите центрировать его, сделайте его родительским элементом простой UIView вместо UIStackView и установите ограничения для центрирования вашего представления в родительском представлении.

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

person rob mayoff    schedule 20.07.2015
comment
Спасибо! Я был обманут представлением иерархии отладки, которое показало 76 в качестве приоритета ограничения в инспекторе. - person Robert Wijas; 21.07.2015
comment
Почему я пытаюсь использовать представление стека для центрирования? Я искал что-то, что можно было бы полностью настроить в IB. - person Robert Wijas; 21.07.2015
comment
@RobertWijas IB позволяет вам определять ограничения .CenterX и .CenterY, которые будут центрировать представление. Либо нажмите кнопку «Выровнять» (вторая в правом нижнем углу рабочего пространства IB), либо удерживая нажатой клавишу «Control», перетащите из подпредставления в его супервизор, и вы увидите параметры по центру. Может я не понимаю твой комментарий. - person Rob; 27.08.2015