UITableViewCell AutoLayout с несколькими ярлыками

Я пытаюсь использовать AutoLayout в UITableViewCell с несколькими ярлыками с процентным вычислением. Я хочу равное пространство между метками, но различной шириной. Также ширина и пространство будут отличаться в режиме "Портрет" и "Пейзаж", как показано на следующих изображениях.

Protrait Display

Landscape Display

Я хочу, чтобы пространство было 4 в Portrait и 8 в Landscape.

В портрете Ширина метки - 50% Label2 Width - 20% Ширина метки - 30%

В Пейзаже Ширина метки - 50% Label2 Width - 15% Label3 Width - 20% Ширина метки - 15%

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

Примечание. Это универсальное приложение и Im, использующее splitview в iPad. В портрете он должен отображать 3 ярлыка, как в iPhone, и в Landscape он должен отображать 4 ярлыка, как указано выше. Также мой главный контроллер просмотра всегда отображается.

Ответ 1

Поскольку классы размера не различают iPad в портрете и iPad в ландшафте, вы не можете использовать классы размера. Что вы можете сделать в своем xib, вы определяете все ограничения, требуемые следующим образом.

  • Определите ограничение для пространства между метками и создайте IBOutlet для него в вашем классе вида, назовите его "gapConstraint".

  • Определите ограничение для ширины каждой метки, которая будет пропорциональна ширине супервизора, например. для большего ограничения ярлыка будет более крупным. width = superView.width * 0.5.

  • Для ярлыков, где вы хотите разную ширину в портретной и альбомной ориентации, определите два ограничения ширины (по одному для каждой ориентации) и установите приоритет одного ограничения на 750 (с высоким разрешением - для портрета), а другой - 500 (низкий - скажем, для пейзажа). Создайте выходы для всех таких ограничений. Нам нужно определить ограничение ширины (одно для портретного и одно для ландшафта) для каждой метки, потому что свойство множителя NSLayoutConstraint является readonly, поэтому после присвоения множителя мы не можем изменить его значение. Чтобы обойти это, мы определяем два ограничения, и в коде, основанном на ориентации, мы активируем более подходящее ограничение, изменив приоритеты.

Переопределить метод UpdateConstraints, и в этом методе вы можете проверить текущую ориентацию устройства. Если ориентация устройства - это изменение портрета, то значение gapConstraints (созданное в точке 1) постоянное значение 4, а в ландшафте изменяет значение константы gapConstraints (созданное в точке 1) на 8. Для ширины меток; в портретной ориентации измените приоритет ограничения ширины портрета до 750 и ниже вниз по приоритету ограничения ширины ландшафта до 500, а в альбомной ориентации измените приоритет ограничения ширины портрета до 500, повысив приоритет ограничения ширины ландшафта до 750.

Ответ 2

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

Метод 1: использование VFL

  • При изменении ориентации устройства ваше табличное представление автоматически перезагружается, поэтому функция cellForRowIndexPath будет вызываться.
  • Проверьте ориентацию устройства в cellForRowIndexPath 3. Удалить все подзаголовки и их ограничения 4.Добавьте все подзапросы с требуемой спецификацией, используя VFL.

Способ 2. Использование другого пользовательского интерфейса UItableViewCell

Для каждой ориентации вы можете использовать различные пользовательские UItableviewCell.

Ответ 3

Сначала мы приходим к проблеме, что вам нужно пространство 4 в портрете и 8 в LandScape.

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

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

Чтобы отключить определенное ограничение для любого класса размера, просто выберите это ограничение, а затем в инспекторе атрибутов вы увидите флажок с именем "Установлено", что означает, что это ограничение включено для этого класса размера. По умолчанию "Установленный" предназначен для класса "Любой Любой", который означает, что это ограничение применяется ко всем классам размера, просто снимите этот флажок.

В левой части этого "Установленного" checkBox есть значок "+", который помогает вам включать или отключать ограничение для определенного класса размера, поэтому выберите нужный класс размера из этого значка и проверьте checkbox этого класса размера.Посмотреть Image1 enter image description here

Теперь добавьте еще одно ограничение горизонтального расстояния для пейзажа и отключите его от класса "Любой Any" и включите его для любой ширины, компактной высоты, которая представляет iphone в Landscape, теперь вы добавили два одинаковых ограничения с разными константами, которые работают в разные ситуации (один - портретный и другой в ландшафте).

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

Чтобы включить или отключить представление в определенном классе размера, выберите метку, затем используйте тот же флажок "Установленный" в атрибутивном инспекторе и отключите четвертую метку для класса размера "Стандартная высота по размеру".

Теперь остается единственное, что вы хотите установить разную ширину для пейзажа и портрета. Для этого мы должны установить ограничение ширины для каждой метки (только четвертая метка имеет одно ограничение ширины) для Portrait и другого для Landscape.

Теперь задайте ограничение ширины для каждой метки для портрета по вашему желанию и включите эти ограничения только для класса размера Compact Width regular Height. Так что они работают только в Portrait.

Теперь со дна платформы storty измените класс размера на "Regular Width Compact height" и снова наложите ограничения ширины на ваши метки на этот раз с разными константами. Вы заметите, что на этот раз вы можете установить ограничение для четвертой метки, поскольку этот ярлык видна только в этом классе размеров.

И вот это:) Надеюсь, это поможет вам, скажите, работает ли это или нет.

Ответ 4

Прикрепленный код - это решение вашей проблемы в iPhone. он работает точно как ваша проблема упоминания в iPhone в портретном и ландшафтном режимах. вы можете обновить эту логику для вашего сплит-представления в iPad. если вы обнаружили какие-либо проблемы, прокомментируйте здесь.

Эта проблема решена с помощью класса size в iOS 8 согласно следующей логике.

1) Добавить ссылочный вид (желтый вид) с общей шириной - общее пространство между меткой

В соответствии с вашей проблемой, упомянутой выше, вы хотите добавить метки по ширине ячейки. Поэтому для этого вы будете требовать. эталонная ширина, потому что вы не можете использовать contentView как ref. поэтому в моем демо-коде мы должны сделать один дополнительный вид для этого желтого представления. дополнительное пространство используется для управления метками b/w.

2) Затем назначить одинаковую ширину с опорной точки зрения на множитель

Теперь вы req. 50% ширины для 1-й метки, поэтому мы используем логику умножителя. например, если вам нужна первая метка 100px, установите "Ref. view" width 200. Точно так же я использую для других меток 20% и 30% отношения ширины к ref. вид.

3) Для портретного режима добавьте еще одно ограничение для класса размера портрета

В портретном режиме вы повторно. только 3 ярлыка, поэтому с помощью класса размера присвойте ширину 4-й метки 0.

все это делается ниже кода

Проверьте мой код с классом размера

Загрузить

Ответ 5

чтобы иметь равное расстояние в UITableViewCell, вы можете добавлять метки вида b/w, а затем устанавливать константу в ширину и высоту всех меток одинаковыми.

in potraitin the landscape