Я обнаружил кое-что интересное, изменившее мой подход
Есть что-то в UIScrollView
, что отговорило меня от его использования. Имея такую возможность, я всегда предпочитаю TableView
, CollectionView
или StackView
перед ScrollView
для пользовательского интерфейса. Однако, покопавшись немного глубже, я обнаружил, что некоторые из моих коллег-разработчиков преуспели в этом. Они попытались объяснить азбуку ScrollView
. Несмотря на это, я всегда как-то сталкиваюсь с неоднозначными ограничениями.
Пару месяцев назад, когда я реализовал ScrollView
в Xcode 11, я обнаружил кое-что интересное, что изменило мой подход к этому. При перетаскивании ScrollView
в раскадровку под ScrollView
появились две вещи: Content Layout Guide
и Frame Layout Guide
.
Итак, что именно они означают? Что ж, Apple объясняет это:
Content Layout Guide
: Руководство по макету, основанное на прямоугольнике непереведенного содержимого в режиме прокрутки. Используйте это руководство по макету, если вы хотите создать ограничения Auto Layout, связанные с областью содержимого прокрутки . - Apple docs
Frame Layout Guide
: Руководство по макету, основанное на непреобразованном прямоугольнике кадра в режиме прокрутки. Используйте это руководство по макету, если вы хотите создать ограничения Auto Layout, которые явно включают прямоугольник рамки самого представления прокрутки, а не прямоугольник его содержимого . - Apple docs
Теперь, если они вам не нужны, мы можем удалить их в раскадровке. (Я бы сильно удерживал вас от этого. Причина? Я подробно объясню это ниже.) После удаления мы можем использовать старый способ, сняв флажок Content Layout Guides в инспекторе размеров:
Но поверьте мне, их сохранение имеет огромное значение. Благодаря им Apple предоставила нам прямой доступ в раскадровке к контенту и фрейму ScrollView
, чтобы мы могли добавлять ограничения к его подпредставлениям, чего раньше не было.
Благодаря этому новому доступу мы теперь можем добавлять подпредставления в ScrollView
и дополнительно определять для него ограничения либо в соответствии с содержимым, либо с фреймом. Конечно, его можно использовать по-разному для разных сценариев, и я объясню один из подходов, с помощью которых я его реализовал.
Во-первых, вместо того, чтобы добавлять ограничения ко всем подпредставлениям в ScrollView
, я добавил UIView
как ContentView
. (По сути, это UIView
- я просто переименовал его в ContentView
.) Это упрощает добавление ограничений.
После добавления ContentView
в ScrollView
, обычно мы добавляем ограничения, выбирая Добавить новые ограничения:
Это добавит ограничения - например, Leading
, Trailing
, Top
и Bottom
к ScrollView
, которые нам не нужны. Вместо этого мы сделаем ContentView
расширяемым по содержимому и размеру, при этом он будет фиксироваться в кадре относительно горизонтальной или вертикальной прокрутки.
Подождите со мной, и я обещаю, что к концу вы поймете, почему мы это сделали. Двигаемся дальше!
Теперь мы должны начать добавлять ограничения, закрепив ContentView
на нашем Content Layout Guide
...
… И добавление ограничений Leading
, Top
, Trailing
и Bottom
, чтобы сделать это ContentView
расширяемым.
Мы посещаем инспектор размера каждого ограничения и вносим следующие изменения:
Теперь нам нужно выбрать раму ContentView
. В этом сценарии я хотел, чтобы ScrollView
прокручивался по вертикали, и я добился этого, прикрепив ContentView
к Frame Layout Guide
и добавив равную ширину.
Это зафиксирует ширину ContentView
в соответствии с рамкой ScrollView
. Если мы хотим зафиксировать высоту и расширить ширину (горизонтальная прокрутка), мы можем установить для нее равные высоты.
Измените ограничение ширины (вертикальная прокрутка) в Инспекторе размеров, чтобы внести соответствующие изменения:
Теперь для последнего шага просто вставьте UILabel
в ContentView
с количеством строк, установленным на 0
, и ограничениями Leading
, Trailing
, Top
и Bottom
, установленными на 20. Запустите приложение и вуаля! Теперь у нас есть правильный ScrollView
с меткой.
Если вы зашли так далеко, благодарим вас за то, что прочитали это, и, надеюсь, эта статья предоставила немного больше информации о когда-либо грозных ScrollView
.