2014-09-22 4 views
13

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

  1. Добавить UIScrollView внутри Main View с рамкой: [наверх: 0, слева: 0, ширина: 320, высота: 568]

  2. Добавить UIView "ContentView" внутри UIScrollView с рамой и BGCOLOR черный: [верхний: 0, слева: 0, ширина: 320, высота: 568]

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

  4. Настройка "ContentView" ограничения: [топ: 0, нижнее: 0, слева: 0, справа: 0]

  5. Выровнять элементы внутри "ContentView"

  6. Set Main View BGCOLOR к серому (в посмотрим, что происходит)

Вот скриншот проблемы: http://imgur.com/P8s9lB0

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

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

EDIT: Я также добавил ширину и высоту ContentView в качестве ограничений, и это тоже не помогло.

ответ

16

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

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

self.scrollView.directionalLockEnabled = YES; 
+0

Спасибо! Горизонтальная прокрутка отключена. – Gasim

+0

no prob .. Что касается проблемы автоматического макета, используете ли вы построитель интерфейса или используете автоматическую компоновку через код? – Derek

+0

Я использую конструктор интерфейса. Я изменил ограничение слева и справа на -16, и он сработал. Я не верю в его правильное поведение. Есть ли способ заставить его работать с 0? – Gasim

1

Дайте просматривать контент явной высоту и ширину ограничений

+0

я -> Ширина: 568, Высота: 320. Не повезло – Gasim

+0

Может быть, ваше мнение содержание не усадка по ее подзонам. Вы получаете автоматические исключения? – mustafa

+0

Нет, ни одного. Вот что.Я начал играть со значениями ограничений, а put -16 как для ведущих, так и для ограничивающих ограничений фактически фиксировал представление, находящееся в середине ... Я действительно не хочу полагаться на такое число. Что может быть причиной этой проблемы? Что вы подразумеваете под сушкой? Более того, теперь, несмотря на то, что функция scrollview работает, она не прокручивается до нужного места. – Gasim

3

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

TegScrolledContent.createContentView(scrollView) 

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

enter image description here

+0

Спасибо evegenii, ваша библиотека действительно помогает мне в моем режиме входа, когда вы идете в пейзаж слева и справа .. –

6

Резюмируя ответ на Лешека S»:

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

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

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

1

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

// 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

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

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

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

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

+1

Это был ответ, который я искал. У меня был contentView равным надзору UIScrollView. благодаря –

1

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

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

да к Scrollview

directionalLockEnabled = true 
Смежные вопросы