Как сделать ScrollView с AutoLayout в Xcode5

В xcode 5 с использованием раскадровок, как можно создать полностью работающее представление прокрутки с вертикальной прокруткой с включенным AutoLayout?
Учитывая, что подпредставления имеют иерархию:

  1.UIView  
    2.UIScrollView
      3.UIView (lets call this UIDetailView to make things easier)

Уточните, пожалуйста, от кода до ограничений, чтобы любое из представлений ДОЛЖНО было быть меньше и т. д.


person KeVal    schedule 01.10.2013    source источник
comment
Какая конфигурация у вас сейчас? Что не работает так, как вы ожидаете?   -  person Wain    schedule 01.10.2013
comment
Конфигурация в коде?   -  person KeVal    schedule 01.10.2013
comment
Очень хорошее практическое решение описано на youtube.com/watch?v=4oCWxHLBQ-A.   -  person Piyuesh    schedule 05.03.2014


Ответы (5)


В этом сообщении в блоге подробно описано, как использовать UIScrollView с включенным автомакетом, используя подход чистого автомакета. Обратите внимание, что все ограничения в сообщении блога определяются через раскадровку.

Подход в посте предполагает следующую иерархию:

1. View (main view of my UIViewController)
  2. Scroll View (UIScrollView)
     3. Container View (UIView)
       4. Content View (e.g. UIImageView)

Я предполагаю, что Container View будет вашим UIDetailView, а Content View будет любым UIView внутри вашего UIDetailView.

https://happyteamlabs.com/blog/ios-how-to-use-uiscrollview-with-auto-layout-pure-auto-layout/

person Dj S    schedule 01.10.2013
comment
как на самом деле установить ограничения? исходный документ Apple кажется довольно сложным. Есть ли способ, которым вы могли бы предоставить полный план того, что делать в раскадровке и что в коде? - person KeVal; 01.10.2013
comment
Ссылка выше подробно описывает ограничения. Единственной недостающей частью руководства являются скриншоты. Это то, что вам нужно? - person Dj S; 02.10.2013
comment
Ну, на самом деле, теперь у меня есть ограничения, но я не могу заставить прокрутку прокручиваться до нужной длины по вертикали. - person KeVal; 03.10.2013
comment
Я вообще не могу заставить его прокручиваться. - person KeVal; 04.10.2013
comment
Если вы правильно установили ограничения и размер вашего представления контента больше, чем область просмотра, ваше представление прокрутки должно иметь возможность прокручиваться. Вы хотите создать пример проекта github, чтобы я мог изучить вашу проблему? - person Dj S; 07.10.2013
comment
ссылка Я сделал этот проект с точно такими же свойствами прокрутки - person KeVal; 10.10.2013

UIScrollView с автомакетом в раскадровках Just Works

Я видел, как несколько человек рекомендовали подход «Контейнерное представление», также известный как грубая сила, для решения проблемы, которую они не понимают. Это неоптимально, так как теперь вы потеряли большое преимущество прокрутки, заставив его думать, что содержимое представляет собой весь прокрутку, а не подвиды, непосредственно прикрепленные к прокрутке.

Вот как я это сделал в следующем примере

--UIScrollView
  |-> UITextView
  |-> UILabel
  |-> UIOtherStuff

При размещении UIScrollView в UIView в раскадровке просто прикрепите края к 4 сторонам UIScrollView к UIView. Теперь добавьте свой контент в UIScrollView, убедившись, что вы указали как минимум два ограничения для каждого измерения. Отличительной особенностью Autolayout является то, что он определяет, насколько большим должен быть размер содержимого прокрутки или UILabels, исходя из размера содержимого внутри него. Он же встроенныйContentSize. Поэтому, если вам выдается предупреждение «Неоднозначный размер содержимого для scrollView», вы знаете, что не наложили на содержимое достаточных ограничений. Например, вы можете указать расстояние между видами сверху, снизу, слева и справа, но ограниченному подвиду также нужна высота, поскольку бесконечная вертикальная плоскость, подобная этой UIScrollView, может предполагать, что ваш вид был от нуля до бесконечной высоты.

Иными словами, руководство Apple по Autolayout на примере составляет простой план успеха из 3 пунктов:

  1. Создайте вид прокрутки.
  2. Поместите элемент пользовательского интерфейса внутрь него.
  3. Создайте ограничения, которые полностью определяют ширину и высоту содержимого прокрутки.

Этот верхний TextView с «Min melding til» также растет по мере того, как вы вводите в него больше строк, и весь ScrollView растет, чтобы содержать его. Хотя я переопределяю класс UITextView, чтобы он возвращал измененное ограничение высоты, сам ScrollView работает правильно без кодирования.

И последнее, во многих сообщениях, связанных с Autolayout, используется волшебное заклинание «все исправить» translatesAutoresizingMaskIntoConstraints = NO. Это необходимо только в том случае, если представление создается программно.

Пример UIScrollView с автомакетом

person Cameron Lowell Palmer    schedule 20.01.2014
comment
Это было чрезвычайно полезно. Использование UIImageView зависит от внутреннего размера содержимого, в то время как это обеспечивает способ размещения любого содержимого в виде прокрутки. Спасибо! - person ryanbillingsley; 18.06.2014

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

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

  • UIView: Позиция с ограничениями.
  • UIScrollView: привязка к UIView с ограничениями.
  • UIDetailView: установите размер (внутренний размер содержимого), максимальное сопротивление сжатию, установите верхние, нижние, ведущие и конечные ограничения для UIScrollView на 0 вручную.
person patric.schenke    schedule 01.10.2013
comment
Вы можете установить все ограничения в Interface Builder. Это было сложно в предыдущих выпусках XCode, поскольку IB всегда пыталась автоматически настроить их, если возникала проблема. Ограничения можно добавить, выбрав элементы, которые вы хотите ограничить (UIScrollView и UIDetailView), а затем выбрав ограничение в меню. После добавления вы можете отредактировать его на панели свойств. - person patric.schenke; 01.10.2013
comment
Я ничего не могу сделать с UIView только с UIScrollView и UIContentView с ограничениями? Могу ли я установить верхний-, нижний-, с помощью кнопки, которая выглядит так: |-+-|? Мне тоже нужно что-то делать в коде? - person KeVal; 01.10.2013
comment
Извините, пожалуйста, ознакомьтесь с правилами сайта. Мы здесь не для того, чтобы учить вас или делать домашнее задание. Пожалуйста, прочтите документацию и посмотрите видеоролики WWDC по этой теме. - person patric.schenke; 01.10.2013
comment
Да, извините, что так много спрашиваю, я бы не был таким конкретным, но НИЧЕГО, кажется, больше не работает (ничего, что работало безупречно в предыдущей версии Xcode) - person KeVal; 03.10.2013
comment
Как я уже сказал: предыдущие версии XCode автоматически добавляли/настраивали ограничения для вас. Что-то облегчало, а что-то делало невозможным — их приходилось делать в коде. Теперь у вас есть полный контроль над вашими ограничениями. Это требует немного больше усилий, но в конечном итоге даст желаемые результаты, а не те, которые вы можете принять. - person patric.schenke; 07.10.2013

У меня была похожая проблема, и я нашел относительно простое решение, похожее на DJ S, из Interface Builder, используя чистый Autolayout без какого-либо кода.

Для проверки концепции сначала удалите все ограничения в View Controller, чтобы убедиться, что это работает.

Это пример макета:

  • Вид (основной вид моего UIViewController)

    • Просмотр прокрутки (UIScrollView)

      • Представление контейнера (UIView)

        • Content View (e.g. UIImageView)

A. Ширина/высота представления прокрутки должны быть меньше ширины/высоты представления контейнера.

B. Контейнерное представление должно иметь некоторую определенную ширину/высоту (может быть явная ширина/высота).

C. Перетащите Контейнерный вид, удерживая нажатой клавишу Control, в вид с прокруткой и добавьте только:

  1. Ведущее пространство к контейнеру
  2. Завершающий пробел в контейнере

D. Проверьте эти два ограничения и установите «постоянное» значение для обоих на 0.

E. Запустите приложение и

person vedrano    schedule 08.12.2013

Из-за новых размеров экрана iPhone 6 и 6+ мне пришлось внести несколько изменений в решение DJ S.

Цель

Поместите UITextView внутри UIScrollView, а также оставьте пробелы 15 pt от левого/правого краев экрана.

Просмотры

1. Main View (main view of my UIViewController)
  2. Scroll View (UIScrollView)
     3. Container View (UIView)
       4. Text View (UITextView)

Решение

Для пробелов я добавил горизонтальные конечные/начальные пробелы размером 15 пт от UIScrollView->Main View. Чтобы сделать ширину UITextView относительно ширины экрана, я добавил ограничение Equal Widths из UITextView -> Main View и установил значение -30 (2 * 15-точечное горизонтальное пространство). Теперь ширина UITextView будет динамически подстраиваться под любой размер экрана.

UIScrollView должно быть Scrolling Enabled. UITextView не должно.

person Rog182    schedule 11.10.2014