Отключить горизонтальную прокрутку в UIScrollView с автозапуском

Я хочу создать представление только с вертикальной прокруткой. Как оказалось, это очень сложно сделать в iOS. Я сделал следующие шаги:

1) Создайте UIViewController в раскадровке;

2) Добавьте ScrollView внутри. Просмотрите в UIViewController и добавьте ограничения 0 с каждой стороны.

3) Добавьте элементы в scrollview, в результате: введите описание изображения здесь

После запуска приложения все работает, но:

1) Как отключить горизонтальную прокрутку? Я добавляю 0 constrain вправо к моему scrollView + 0 constrain справа от моего uilabel (так как вы видите на экране по каким-то причинам он не привязан к правой стороне, он имеет различный ограничитель, но в свойстве я устанавливаю constrain = 0) и, как я думал, текст надписи должен быть в моих границах экрана, но когда я запускаю приложение, я могу прокрутить вправо, т.е. текст uilable не был завершен, мой scrollview просто изменил размер в соответствии с текстом. Я попытался установить свой scrollView в коде: scrollView.contentSize = CGSize(UIScreen.mainScreen().bounds.width, height: 800), но не помогло.

2) Если я много прокручиваю, появляется пустое пространство, и это не здорово, как его исправить?

Ответы

Ответ 1

1) Горизонтальная прокрутка позволяет автоматически, когда ширина содержимого в scrollView больше ширины scrollView. Поэтому, чтобы избежать горизонтальной прокрутки, необходимо сделать ширину содержимого внутри scrollView меньше или равно ширине прокрутки.

Leading space и trailing space не могут устанавливать определенную ширину в представлениях, они просто растягивают их. В обычных представлениях они не растягиваются больше, чем ширина вида, но scrollView представляет собой особый вид, фактически, с бесконечной шириной содержимого. Следовательно, ограничения trailing space и Leading space в scrollView изменяют ширину представлений до их максимально возможных значений (в случае с UILabel вы можете видеть изменение размера для текста).

Чтобы избежать горизонтальной прокрутки, вам нужно установить определенную ширину каждого вида, меньше или равную ширине прокрутки. Конкретную ширину представлений можно установить с помощью width constraints.

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

Иерархия просмотров:

View
    -> ScrollView
        -> ContainerView
            -> UILabel
            -> UILabel
            -> ... other views that you need

Ограничения автоопределения:

ScrollView
    -> leading space to View : 0
    -> trailing space to View : 0
    -> top space to View : 0
    -> bottom space to View : 0

Container View
    -> leading space to ScrollView : 0
    -> trailing space to ScrollView : 0
    -> top space to ScrollView : 0
    -> bottom space to ScrollView : 0
    -> width equal to ScrollView : 0

Чтобы установить width equal constraint ctrl + перетащить с containerView на scrollView.

width equal constraint

2) Вертикальная прокрутка зависит от общей высоты содержимого. Пустое пространство может быть, если последний элемент внутри containerView имеет большое значение bottom space to superview.

Или вы имеете в виду эффект отскока? Вы можете отключить вертикальный откат scrollView.