Как правильно использовать класс размера в XCode?

Я начал проект в классе размеров Any Width, Any Height, и для одной из сцен было несколько элементов пользовательского интерфейса (более 10). Недавно я хотел изменить макет этой сцены для класса размера Any With, Compact Height (для iPhone в альбомной ориентации). И я не мог найти правильный способ справиться с этим.

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

Вот пример:

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

Любая ширина, любая высота. Установлены ограничения.

введите здесь описание изображения

Любая ширина, компактная высота с ограничениями от любой ширины, любой высоты

Теперь для iPhone в альбомной ориентации я хотел переместить метки так, чтобы они были рядом, поэтому сначала в нижней части XCode я изменил на wAny hCompact, а затем перетащил и изменил размер меток, чтобы они были рядом. Перед добавлением дополнительных ограничений это выглядит так, как показано ниже.

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

введите здесь описание изображения

Любая ширина, компактная высота. Неустановленные ограничения любой ширины, любой высоты

Поэтому я удалил эти ограничения  введите описание изображения здесь

Любая ширина, компактная высота. Добавлены собственные ограничения

А затем я добавил ограничения для текущего класса размера, Любая ширина, Компактная высота  введите описание изображения здесь

Любая ширина, любая высота. Теперь нет ограничений, Xcode выдает ошибки и предупреждения

Вернемся к классу размера Any Width, Any Height, ограничения не применяются, так как я их удалил. Но если я снова добавлю ограничения, это повлияет на любую ширину и компактную высоту. введите здесь описание изображения

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

Однако для любой ширины и любой высоты по-прежнему нет ограничений, и XCode выдает предупреждения.

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

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


person shane716    schedule 07.04.2016    source источник


Ответы (1)


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

Один набор для класса Any,Any, а другой набор для класса Any,Compact.

Уловка состоит в том, чтобы убедиться, что ограничения, которые не нужны для данного класса размера, специально удалены в этом классе - я покажу вам, что я имею в виду, ниже.

Ваши ограничения в размере Any,Any будут:

  • Этикетка 1

    • Leading space to superview = 0
    • Конечный пробел до супервизора = 0
    • Верхнее пространство вверху руководства по макету = 0
    • Нижнее пространство для метки 2 = 0
    • Равная высота метки 2 = 0
  • Этикетка 2

    • Leading space to superview = 0
    • Конечный пробел до супервизора = 0
    • Расстояние от нижнего края до нижнего руководства по макету = 0
    • Верхнее пространство для метки 1 = 0
    • Равная высота метки 1 = 0

Ограничения для метки 1 должны выглядеть так, а ограничения для метки 2 должны быть похожи:

Ограничения ярлыка 1

Теперь выберите класс Any,Compact, отрегулируйте положение двух меток и добавьте следующие ограничения:

  • Этикетка 1

    • Bottom space to bottom layout guide = 0
    • От заднего края до переднего края label2 = 0
    • Равной ширине метке 2
  • Этикетка 2

    • Top space to top layout guide = 0
    • От переднего края до заднего края label1 = 0
    • Равной ширине метке 1

Теперь отключите ненужные ограничения в Any,Compact, дважды щелкнув ограничение, щелкнув «+», чтобы добавить Any,Compact, а затем сняв флажок, чтобы он выглядел следующим образом:

введите здесь описание изображения

Ненужные ограничения для Any,Compact:

  • Этикетка 1

    • Trailing space to superview
    • Нижнее пространство для метки 2
    • Высота равна метке 2
  • Этикетка 2

    • Leading space to superview
    • Верхнее пространство для метки 1
    • Высота равна метке 1

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

введите здесь описание изображения

Ненужные ограничения для Any,Any:

  • Этикетка 1

    • Trailing space label 2
    • От нижнего края до нижнего руководства по компоновке
    • Равная ширина этикетки 2
  • Этикетка 2

    • Leading space to label 1
    • Руководство по макету от верхнего места к верхнему
    • Равная ширина этикетки 1

Теперь у вас должна быть возможность переключаться между Any,Any и Any, Compact, и метки перемещаются в нужное место.

Я загрузил раскадровку с соответствующими ограничениями сюда: https://gist.github.com/paulw11/f1b0faa229b152f1c53dadefcf9e0885

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

person Paulw11    schedule 08.04.2016
comment
Наконец-то представился шанс опробовать ваше решение, и оно отлично работает! Спасибо - person shane716; 15.04.2016