Подтвердить что ты не робот

Только UIScrollView AutoLayout только для вертикали

Я хочу, чтобы AutoLayout работал с UIScrollView, и у меня небольшие проблемы с ним. Вот что я сделал:

  1. Добавьте UIScrollView в главном окне с рамкой: [top: 0, left: 0, width: 320, height: 568]

  2. Добавьте UIView "ContentView" внутри UIScrollView с рамкой и bgcolor black: [top: 0, left: 0, width: 320, height: 568]

  3. Установите ограничения UIScrollView: [вверху: 0, внизу: 0, слева: 0, справа: 0]

  4. Установите ограничения ContentView: [top: 0, bottom: 0, left: 0, right: 0]

  5. Совместите элементы внутри "ContentView"

  6. Установите основной вид bgcolor на серый (чтобы увидеть, что происходит)

Вот скриншот проблемы:

Screen Shot1

По какой-то причине ограничения делают просмотр содержимого посередине экрана. Кроме того, он прокручивается во всех направлениях. Я хочу, чтобы содержимое можно было прокручивать только в вертикальном направлении, как в UITableView. так что я не могу переместить его, как показано ниже:

Screen Shot

Что я делаю неправильно? Я проверил все учебные пособия и ответы, которые я могу найти в Qaru и Google, и ни у кого на самом деле нет просто странной проблемы, поэтому я прошу помощи.

ОБНОВЛЕНИЕ: Я также добавил ContentView ширину и высоту в качестве ограничений, и это тоже не помогло.

4b9b3361

Ответ 1

Для отключения горизонтальной прокрутки вы можете установить размер содержимого в методе scrollViewDidScroll (void).

[self.scrollView setContentOffset: CGPointMake(0, self.scrollView.contentOffset.y)];

Вы также захотите установить блокировку направления так, чтобы одновременно использовалось только одно направление прокрутки. https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/occ/instp/UIScrollView/directionalLockEnabled

self.scrollView.directionalLockEnabled = YES;

Ответ 2

Вы можете сделать это полностью, используя ограничения, и это очень просто.

UIScrollView просто нужно понять, сколько ширины и пространства у него внутри. Поэтому для привязки Leading, Trailing, Top и Bottom нужно что-то приколоть. Также необходимо фиксировать ширину и высоту содержимого (это не значит, что я должен его специфицировать). Я все еще могу использовать ограничения для достижения этого.

  • Добавьте UIScrollView и положение по мере необходимости.
  • Добавьте UIView внутри UIScrollView для содержимого.
  • Задайте ограничения Leading, Trailing, Top и Bottom содержимого UIView равным 0.
  • Добавьте ограничение Equal Width в UIScrollView и UIView. Это приведет к вертикальной прокрутке.
  • Теперь вам нужно установить высоту содержимого UIView. Затем вы можете указать высоту представления содержимого (blech) или использовать высоту элементов управления, содержащихся внутри, убедившись, что нижний элемент управления ограничен нижней частью содержимого.

Я сделал это, и это сработало.

Ответ 3

Подводя итог ответу Leszek S:

Чтобы иметь представление с вертикальной прокруткой, все представления внутри прокрутки должны иметь ограничение ширины. Легко просто установить вид просмотра прокрутки.

Причина в том, что представление прокрутки не будет прокручиваться по горизонтали, так что ни один из его подзонов не должен прокручиваться по горизонтали. Например, если у вас есть метка, установите ее в 0 строк, автоматический макет попытается сделать ярлык настолько широким, насколько это возможно, прежде чем он начнет добавлять строки и разрывы строк. Если на ярлыке нет явных ограничений ширины, это просто увеличит область содержимого прокрутки. Ограничения для перехода к просмотру прокрутки игнорируются.

Если у вас есть куча просмотров, вы можете поместить их внутри одного содержащего представления, как в этом видео. Для моего случая у меня есть только 5 или 6 ярлыков, которые могут динамически изменять высоту, но никогда не должны менять ширину, поэтому я просто сделал их одинаковой ширины, как вид прокрутки. И бинго, вертикально прокручивая представление с ярлыками, которые растут или сжимаются в зависимости от текста.

Ответ 4

Я написал функцию, которая позволяет прокручивать содержимое по вертикали, но не по горизонтали. Он создает UIView с ограниченной шириной внутри scrollview и вставляет в него все просмотры прокрутки.

TegScrolledContent.createContentView(scrollView)

https://github.com/exchangegroup/scrollable-content-ios

enter image description here

Ответ 5

Дать представление содержимого в явном виде ограничения высоты и ширины

Ответ 6

Ниже приведен фрагмент, который я использовал для просмотра вертикальной прокрутки. Он работает, добавляя представление содержимого в виде дочернего представления прокрутки, а затем ограничивая ширину этого представления содержимого шириной представления родительского прокрутки. С этого момента все надстройки должны быть добавлены в представление содержимого, а не в представление прокрутки.

// View that will contain content of scroll view. Width is constrained to the width of the scroll view.
UIView *contentView = [[UIView alloc] init];
contentView.translatesAutoresizingMaskIntoConstraints = NO;
[scrollView addSubview:contentView];

views[@"contentView"] = contentView;
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:views]];

// Now, add all your subviews to contentView

Ответ 7

Наряду с ответом @derek я хотел бы добавить, что настройка contentOffset всегда в scrollViewDidScroll вызовет проблемы с производительностью. Поэтому, пожалуйста, проверьте только, если x не 0, а затем установите contentOffset

    if(contentOffset.x != 0){
        setContentOffset(CGPointMake(0, contentOffset.y), animated: false)
    }

и да для прокрутки

directionalLockEnabled = true