Я обнаружил кое-что интересное, изменившее мой подход

Есть что-то в 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.