Я пытаюсь понять, как работает UIScrollView в среде автоматического макета. До сих пор я пробовал читать документацию Apple, исследование, исследования Google и изучение рабочего примера Мэтта Нойберга.
В документации Apple 6.1 говорится:
Центральное понятие объекта UIScrollView (или, просто, прокрутки view) заключается в том, что это представление, происхождение которого регулируется по содержимому Посмотреть. Он закрепил контент до его кадра, который обычно (но не обязательно) совпадает с таковым в главном окне приложения. просмотр прокрутки отслеживает движения пальцев и регулирует начало координат соответственно. Представление, показывающее его содержимое через "свиток" представление рисует эту часть себя на основе нового происхождения, привязано к смещению в представлении содержимого. Сам вид прокрутки нет чертежа, за исключением отображения вертикальной и горизонтальной прокрутки показатели. В представлении прокрутки должен быть указан размер представления содержимого, поэтому он знает, когда прекратить прокрутку; по умолчанию он "отскакивает" назад, когда прокрутка превышает границы содержимого.
Исходя из этого, давайте рассмотрим, как должны быть настроены ограничения.
Чтобы было проще обсуждать, скажем, у нас есть 3 представления в общем случае - представление контроллера основного вида по умолчанию (A), его подвью - это UIScrollview (B), а UIScrollview имеет одно подзаголовок, UIView (C). Скажем, мы хотим, чтобы (C) составлял 1000 единиц.
Итак, мы заходим в конструктор интерфейса, выбираем контроллер представления в панели рассказов, а на вкладке инспектора атрибутов изменяем размер на произвольную форму. Для видов (A), (B) и (C) мы меняем высоту на 1000 на вкладке инспектора размера.
Ограничения между (A) и основным окном
Время установки ограничений. В документации четко указано: "(Scrollview) зажимает содержимое в свой кадр, который обычно (...) совпадает с содержимым главного окна приложений". В нашем примере (A) будет совпадать с основным окном приложения, и для этого не требуются ограничения.
Ограничения между (A) и (B)
Теперь в документации было ясно, что (B) точно совпадает с (A), поэтому мы будем устанавливать между ними 4 ограничения, ведущее пространство, конечное пространство, верхнее пространство и нижнее пространство, чтобы контролировать все с константой 0.
Ограничения между (B) и (C)
Документация здесь не так прямолинейна. В нем говорится, что (B) происхождение регулируется по (C), поэтому (B) обязательно должно быть меньше (C). Поскольку мы знаем, что прокрутка будет только вверх и вниз, мы можем ограничить левый и правый края между (B) и (C) до нуля, и мы всегда хотим, чтобы это было посередине, поэтому мы добавим центр x выравнивание. Мы добавим к ним 3 ограничения, ведущее пространство и конечное пространство для просмотра с константой 0 и выравниванием по центру x. Чтобы позиционировать представление, нам нужно что-то для верхнего и нижнего уровня, и, честно говоря, я не уверен, как эти ограничения должны быть настроены на основе документации. На основе имитации Matt Neuberg example Я сделал их верхним пространством для наблюдения с константой нуля и нижним пространством для наблюдения с любой константой, которую он генерирует по умолчанию. Это нижнее пространство для ограничения супервизора является особенным (по-видимому), отныне оно упоминается как "specialConstraint".
Итак... что?! Мы начали этот параграф, сказав, что (B) определенно будет меньше, чем (C), и закончил его, установив ограничения, чтобы сделать их точно того же размера. Вопрос 1 - Почему это?
Ограничения на (C) самим собой
Мы знаем, что (C) должно быть больше, чем (B), так что (B) имеет что-то, что можно прокрутить, и (C) должно определить его размер на основе собственных ограничений. Достаточно легко установить 1 ограничение, высота = 1000.
specialConstraint
Теперь мы создаем выход для specialConstraint в контроллере представления, а в методе viewDidLoad мы устанавливаем self.specialConstraint.constant = 0; Это означает, что нижняя часть содержимого должна быть привязана точно к нижней части прокрутки, что не даст вам ничего прокрутить вниз. Но это работает в примере Мэтта Нойберга. Вопрос 2 - почему это?
Что действительно происходит при прокрутке Scrollview
Я бы подумал, что логическая задача состоит в том, чтобы фиксировать рамку прокрутки, а происхождение представления контента (или смещения содержимого) перемещается с прокруткой, а контент показывает прокрутку в виде окна, Аналогично просмотру бумаги через отверстие в стене, сдвинув бумагу вокруг.
Однако, основываясь на моем чтении, кадр scrollview фактически выполняет перемещение, например, увеличительное стекло на фиксированной странице.
Вопрос 3. Может ли кто-нибудь объяснить, что происходит, когда свиток scrollview, какой из исходных фреймов объекта меняется, и почему это делается так?
Вопрос 4 - Может ли кто-нибудь объяснить, как ограничения должны быть установлены между (A), (B) и (C) на простом английском языке?