Как избавиться от нежелательных ограничений, добавленных UIStackView? - PullRequest
0 голосов
/ 29 ноября 2018

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

Я попытался определить ограничение ширины, чтобы сделать это, и попытался использовать конечные и ведущие ограничения пространства, но во время выполнения они нарушаются, поскольку система не может "одновременно удовлетворять ограничениям".Из консоли довольно ясно, что представляют собой конфликтующие ограничения, но я не добавил (см. Рис. Ниже) те, которые связывают сегментированный элемент управления с левым и правым краем его контейнера UIStackView, поэтому я не знаю, как избавиться от него.из них.Система нарушает ограничение, которое я хочу сохранить.

Мне должно быть ясно, что я не обязательно требую ограничения ширины для UISegmentedControl - трейлинг и ведущие пробелы также будут служить.Чтобы быть совершенно ясным, мне нужно иметь возможность контролировать ширину сегментированного элемента управления.

Обратите внимание на $ WIDTH-SEGCTRL в выводе консоли ниже.Это из идентификатора, который я определил в ограничении в Интерфейсном Разработчике.

2018-11-29 10:43:56.323503-0600 [21479:18697482] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x604000291440 H:[UIStackView:0x7f96373120d0]-(0)-|   (active, names: '|':SectionHeaderView:0x7f9637311e20 )>",
    "<NSLayoutConstraint:0x6040002985b0 H:|-(0)-[UIStackView:0x7f96373120d0]   (active, names: '|':SectionHeaderView:0x7f9637311e20 )>",
    "<NSLayoutConstraint:0x6000004913f0 '$WIDTH-SEGCTRL' UISegmentedControl:0x7f9637312d90.width == 280   (active)>",
    "<NSLayoutConstraint:0x60400029af90 '_UITemporaryLayoutWidth' SectionHeaderView:0x7f9637311e20.width == 320   (active)>",
    "<NSLayoutConstraint:0x604000486720 'UISV-alignment' UIStackView:0x7f96373122d0.leading == UISegmentedControl:0x7f9637312d90.leading   (active)>",
    "<NSLayoutConstraint:0x604000486770 'UISV-alignment' UIStackView:0x7f96373122d0.trailing == UISegmentedControl:0x7f9637312d90.trailing   (active)>",
    "<NSLayoutConstraint:0x604000486680 'UISV-canvas-connection' UIStackView:0x7f96373120d0.leading == UIStackView:0x7f96373122d0.leading   (active)>",
    "<NSLayoutConstraint:0x6040004866d0 'UISV-canvas-connection' H:[UIStackView:0x7f96373122d0]-(0)-|   (active, names: '|':UIStackView:0x7f96373120d0 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000004913f0 '$WIDTH-SEGCTRL' UISegmentedControl:0x7f9637312d90.width == 280   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

Ниже приведены фотографии до и после добавления ограничения ширины, которое создает проблему.Вы можете видеть, что Xcode рассматривает ограничение ширины 280 как что-то, что он не может выполнить.Он считает сегментированный элемент управления привязанным к краям, но я не могу понять, почему.

До: enter image description here

После: enter image description here

1 Ответ

0 голосов
/ 29 ноября 2018

Чтобы сделать это с вашим макетом просмотра стека ...

Для Вертикального стека установите Alignment: Center

Для Горизонтального стека установите Width равным Вертикальному стекуШирина просмотра

Для сегментированного элемента управления установите Width равным ширине просмотра вертикального стека с константой -40, что оставит отступы по 20 пунктов с каждой стороны.Настройте константу по своему вкусу или установите множитель на 0,9, чтобы сегментированный элемент управления составлял 90% ширины.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...