2015-07-03 7 views
10

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

Protrait Display

Landscape Display

Я хочу, чтобы пространство, чтобы быть 4 в портретном и 8 в ландшафтном.

В Портрет Label1 Ширина - 50% Label2 Ширина - 20% Метка3 Ширина - 30%

В ландшафтном Label1 Ширина - 50% Label2 ширина - 15% Метка3 Ширина - 20% Label4 Ширина - 15%

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

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

+0

Чтобы достичь этого, вам нужно использовать 'Size Classes'. Вот довольно хороший [учебник от Рэя Вендериха] (http://www.raywenderlich.com/83276/beginning-adaptive-layout-tutorial) –

+0

Вы устанавливаете ограничения расстояния и ширины, когда ориентация меняется так, как вы хотите? – Bhanupriya

+0

@BhanuPriya Я ничего не делаю программно. Я знаю, что могу добиться этого с помощью кодирования. Но я ищу какое-то решение, которое будет сделано в StoryBoard. –

ответ

-1

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

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

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

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

С левой стороны этого «Установленного» checkBox есть значок «+», который позволяет включить или отключить ограничение для определенного класса размера, поэтому выберите нужный класс размера из этого значка и проверьте checkbox этого размера class.See Изображение1 enter image description here

Теперь добавьте еще один горизонтальный интервал ограничения для ландшафта и отключите его от «любого любого» размерного класса и Enabled его для любой шириной, Compact высоты, которая представляет Iphone в ландшафтном, теперь вы добавили два такое же ограничение с разными константами, которое работает в разных ситуациях (один - портретный и другой в ландшафте).

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

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

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

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

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

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

+0

Я обновил свой вопрос. Моя проблема состоит в том, что у вас 3 ярлыка в портрете и 4 метки в Landscape при использовании SplitView в iPad. Я не говорил об этом четко. –

+0

Так что это не кажется проблемой, вы просто используете View Controller на Story Board и размещаете View on ViewController, отключите этот вид для класса размера «Обычная ширина компактной высоты», а затем перетащите splitView на этом ViewController и отключите его для «Compact Ширина регулярной высоты ". И тогда у вас есть два отдельных вида: один для Portrait (UiView), а другой - для Landscape (UISplitView). Поместите 3 ярлыка на Uiview и 4 метки на SplitView и включите метки для соответствующего класса размера. Теперь вы можете использовать мой вышеприведенный ответ для дальнейшего руководства. –

-1

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

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

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

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

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

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

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

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

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

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

Download

+0

Может ли кто-нибудь объяснить, в чем проблема с этим? –

1

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

  1. Определение ограничений для пространства между метками и создать IBOutlet для него в классе просмотра, позволяет назовите его «gapConstraint».

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

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

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

-1

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

in potrait in the landscape

+0

Вопрос заключался в том, как настроить метки ширины DIFFERENT. –

+0

@ ReinhardMänner Вы можете попробовать другую ширину. Это было просто для иллюзий. – Misha

0

вы можете достичь желаемого макета с помощью следующих способов

Метод 1: с помощью VFL

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

Метод 2: Использование различного пользовательского UITableViewCell

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