2013-07-11 3 views
2

Я пытаюсь настроить свою точку зрения следующим образомIOS Autolayout С Unknown Heights

layout http://i40.tinypic.com/2eulm4z.png

Каждый вид содержит ряд представлений детей, таких как этикетки и кнопки. Для моего проекта я должен использовать автозапуск. В частности, я использую стороннюю библиотеку под названием FLKAutolayout, которая просто ускоряет работу. Проблема в том, что каждый из этих видов имеет динамическую высоту. Это нормально, чтобы прикрепить обе стороны каждого вида к каждой стороне родительского вида. Однако, когда дело доходит до упорядочивания вещей по вертикали, я сталкиваюсь с неоднозначными макетами. Я попытался прикрепить вид 1 к вершине супервизора, сверху взглянуть на верхнюю часть 2, чтобы посмотреть снизу 1, посмотреть верх 3 сверху, чтобы посмотреть снизу 2 и т. Д. Если я не привяжу нижний вид к нижней части супервизора, ничего не появится. Если я делаю вывод нижнего большинства в нижней части супервизора, только верхний вид большинства растягивается до полного размера экрана. Если я вручную ограничиваю высоты до произвольных количеств, все будет хорошо. Проблема с этим, конечно, в том, что я не знаю, какими должны быть высоты, поскольку они меняются в зависимости от содержимого.

Есть ли хорошая стратегия для управления массивом представлений с переменной высотой? Кроме того, я думаю, мне нужно добавить, что возможно (и, вероятно,), что общая высота просмотров будет больше, чем размер высоты представления контроллера вида, который содержит эти вертикальные виды. В конце концов, я хочу прокручивать их с помощью UIScrollView, но пока все нормально, чтобы они продолжали работать на экране.

ответ

0

Я не думаю, что есть способ сделать это, не устанавливая конкретные высоты для просмотров. Вы можете сделать IBOutlets каждому из них и изменить их постоянный параметр в коде на основе размера содержимого. Я предполагаю, что другой способ, который может работать, - дать им произвольные размеры в IB, а затем вызвать sizeThatFits на них после добавления любых подзаголовков.

3

У каждого UIView есть метод -(CGSize)intrinsicContentSize. Если содержимое ваших представлений изменяется динамически, вы должны переопределить метод и вернуть соответствующие размеры на основе содержимого представления. Auto layout использует эту информацию для расчета высоты представления. Возможно, вам придется позвонить -(void)invalidateIntrinsicContentSize, чтобы система узнала, что собственный размер изменился. BTW: Большинство продуктов Apple, посвященных UIKIT, уже обеспечивают правильный внутренний размер.

+0

я думал, что intrinsicContentSize может иметь что-то делать с этим, но как бы я вычислил представление? Разве он не должен автоматически вычислять его на основе своих подходов и их ограничений? – Sethypie

+0

Если вы создаете пользовательский вид, ему нужна помощь. Это помогает, если вы говорите больше о том, какие пользовательские представления это. – Maarten

+0

Я рекурсивно назвал все subviews intrinsicSize в файле keeperview, и оказывается, что высота на самом деле является тем, что делает contenterview настолько большим. Почему он может вычислять неправильный собственный размер содержимого? Подразделы - это всего лишь UILabels, UIButtons и UIImages. – Sethypie

0

Я не знаю о FLKAutoLayout. Но я пробовал аналогичную ситуацию и имел успех.

Как на рисунке, view1, view2, view3 связаны друг с другом линейным способом.

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

Теперь уловка состоит в том, чтобы иметь ограничение по высоте для супервизора и устанавливать его приоритет на меньшее значение, чем все остальные ограничения. Например, если у вас есть 1000, заданный как приоритет для других ограничений, установите 999 для этого ограничения superView.

Теперь, когда вы визуализируете свой контент в view1, view2, view3, соответственно изменяйте их высоту с помощью соответствующего ограничения по высоте (путем изменения его постоянного значения). Вы увидите, что subViews теперь автоматически настраиваются в нужном положении, также супервизор сам корректирует свою высоту.

Теперь, чтобы выполнить упражнения для scrollview, вам просто нужно обновить contentSize.Как, изменение высоты за счет ограничения, не выявляет фактическую высоту сразу же, вы должны обновить Scrollview в следующих обратного вызова -viewDidLayoutSubViews

я надеюсь, что это тренировками в вашем сценарии