Как установить ограничения, чтобы ширина представления была 0, если она не может быть хотя бы определенной ширины - PullRequest
4 голосов
/ 21 октября 2019

Я пытаюсь создать раскадровку стартового экрана (поэтому без кода) с несколько более сложной компоновкой.

Проблема в том, что мне нужны два представления, показанные рядом (вроде контроллера раздельного просмотра)). Вот требования:

  1. Ширина левого обзора должна быть вдвое меньше ширины правого обзора. Другими словами, левый вид занимает левую 1/3 экрана.
  2. Ширина левого обзора должна быть не более 375 точек. Это имеет приоритет над первым ограничением. Другими словами, левый вид должен пытаться занять левую 1/3 экрана, но не должен быть шире 375.
  3. Ширина левого обзора должна составлять не менее 340 точек. Если ширина из-за первого ограничения будет меньше 340, она должна быть уменьшена до 0, а правый вид должен занимать всю ширину экрана. Другими словами, если ширина экрана меньше 1020, то должен быть виден только правильный вид.

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

У меня первые два требования работают нормально. Я не могу понять, как применить 3-е требование.

Вот ограничения, которые у меня есть на данный момент:

  • LeftView.top = SuperView.top
  • LeftView.bottom = SuperView.bottom
  • LeftView.leading = SuperView.leading
  • RightView.top = SuperView.top
  • RightView.bottom = SuperView.bottom
  • RightView.trailing = SuperView.trailing

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

  • LeftView.trailing = RightView.leading
  • LeftView.width = 0,5 * RightView.width @999
  • LeftView.width <= 375 </li>

Имея их на месте, вы можете увидеть результаты на различных iPad.

На 12,9 "iPad в портретной ориентации вы будетесм. левый вид, занимающий левую 1/3 экрана, и правый, занимающий правые 2/3 экрана. На 12,9-дюймовом iPad в альбомной ориентации левый вид максимально равен 375, а правый вид занимает остальную частьэкран. Пока все хорошо.

На 9,7-дюймовом iPad в альбомной ориентации вы видите левый вид, занимающий 1/3 экрана, а правый - 2/3 экрана справа. Опять же, хорошо.

Проблема, которую я пытаюсь решить, начинается с 9,7 "iPad в портретной ориентации. Левый вид занимает 1/3 экрана, но он действительно узкий. Это всего 256 пунктов в ширину. Так как это меньше, чем мой желаемый минимум 340, я не хочу, чтобы левый вид вообще появлялся. Правый обзор должен заполнить весь iPad.

Существует ли какая-то комбинация ограничений, возможно, с различными приоритетами, которые могут заставить ширину левого обзора равняться 0, если она не может быть как минимум 340?

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

1 Ответ

1 голос
/ 29 октября 2019

Похоже, мне удалось добиться того, что тебе нужно. Протестировал его на iPad 9,7 "и 12,9", работает как положено. Это немного беспорядок, но это работает.

Хитрость заключается в том, чтобы использовать дополнительный вид, который должен иметь ширину 0 пунктов, если экран меньше 1020 пунктов, и ширину 1 пункт в противном случае (я буду ссылаться наэто как OnePixelWideView). Затем создайте свой LeftView.width == 375 * OnePixelWideView.width @ 999.

Еще одно осложнение заключается в том, что он не будет работать с LeftView.width = 0.5 * RightView.width @ 999 независимо от приоритета, но мы можем обойти это, добавив еще один вид со сторонами, прикрепленными к суперпредставлению (я будуназовите его FullscreenView) и сделайте LeftView.width <= 0.33 * FullscreenView.width

Вот полный список горизонтальных ограничений:

FullscreenView.leading = superview.leading
FullscreenView.trailing = superview.trailing

superview.trailing = OnePixelWideView.trailing + 1019
superview.leading = OnePixelWideView.leading @ 999
OnePixelWideView.width <= 1

LeftView.leading = superview.leading
LeftView.width <= 375
LeftView.width <= 0.33 * FullscreenView.width
LeftView.width = 375 * OnePixelWideView.width @999

RightView.leading = LeftView.trailing
RightView.trailing = superview.trailing

Здесь - это содержимое .storyboard длятренировка.

...