Только UIScrollView AutoLayout только для вертикали
Я хочу, чтобы AutoLayout работал с UIScrollView
, и у меня небольшие проблемы с ним. Вот что я сделал:
Добавьте UIScrollView
в главном окне с рамкой: [top: 0, left: 0, width: 320, height: 568]
Добавьте UIView
"ContentView" внутри UIScrollView
с рамкой и bgcolor black: [top: 0, left: 0, width: 320, height: 568]
Установите ограничения UIScrollView
: [вверху: 0, внизу: 0, слева: 0, справа: 0]
Установите ограничения ContentView: [top: 0, bottom: 0, left: 0, right: 0]
Совместите элементы внутри "ContentView"
Установите основной вид bgcolor на серый (чтобы увидеть, что происходит)
Вот скриншот проблемы:
1
По какой-то причине ограничения делают просмотр содержимого посередине экрана. Кроме того, он прокручивается во всех направлениях. Я хочу, чтобы содержимое можно было прокручивать только в вертикальном направлении, как в UITableView
. так что я не могу переместить его, как показано ниже:
![Screen Shot]()
Что я делаю неправильно? Я проверил все учебные пособия и ответы, которые я могу найти в Qaru и Google, и ни у кого на самом деле нет просто странной проблемы, поэтому я прошу помощи.
ОБНОВЛЕНИЕ: Я также добавил ContentView ширину и высоту в качестве ограничений, и это тоже не помогло.
Ответы
Ответ 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