2016-07-20 3 views
8

Я действительно сталкиваюсь с трудностями, чтобы сделать мой UIScrollView полностью отзывчивым, используя только ограничения раскадровки.Рост содержимогоПросмотр UIScrollView на основе внутреннего содержимого с помощью раскадровки

Вот моя иерархия:

> - UIViewController 
> - UIView 
> - UIScrollView 
> - contentView 
>  - module1View 
>  - module2View 
>  - module3View 

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

Мой вопрос: Как вы устанавливаете высоту contentView, равную сумме всех модулей (модуль 1 + 2 + 3)?

Другими словами я хочу добиться:

  • Верх contentView = верхней части модуля 1
  • Верх модуля 2 = Дно модуля 1
  • Верх модуля 2 = Дно модуль 2
  • Нижняя часть contentView = нижней части модуля 3

Чтобы это сделать, я следую некоторому учебнику, найденному в Интернете. Вот шаги, которые я затем:

  1. Установка UIScrollView контрсил для определения его места и положения.
  2. Установка UIScrollViewверхней, нижний, оставил и правильный интервал до ближайшего соседа .
  3. Установка ограничение между модулями для «складывания» их одного на прочее.
  4. (я BLOCKED ЗДЕСЬ) Установка нижней части contentView к нижней части модуля 3, чтобы позволить UIScrollview для прокрутки до конца содержания.

Я попытался заставить высоту UIScrollView: Он работает, но он не реагирует. Поскольку высота модуля рассчитывается через коэффициент, в зависимости от устройства, высота «модуль 1 + 2 + 3» изменяется при изменении.

Я попытался добавить ограничение от модуля 3 к contentView, чтобы установить нижнюю часть модуля 3 = нижнюю часть contentView. Все ограничения становятся красными с предупреждением повсюду.

У вас есть идея установить высоту contentView на основе отзывчивого контента? (Например, «wrap-content»).

Заранее благодарим за помощь!

+0

После того, как вы установите высоту модулей на основе их отношения, вы сможете рассчитать высоту для contentView –

+0

Я попытался добавить: 'mainContentView.frame = CGRectMake (0, 0, self.view. width, module1View.height + module2View.height + module3View.height); 'в ViewDidLoad и viewWillAppear, ни один из них не работал –

+0

, когда вы устанавливаете фрейм модулей? вам нужно установить кадр mainContentView после того, как установлены фреймы модулей ... какой тип объекта являются модулями? –

ответ

31

Я был в состоянии получить динамические представления прокрутки работает полностью из раскадровки, без кода, со следующими шагами:

1) В раскадровке добавить представление прокрутки и ограничить ее края к края основного вида или любым способом

2) Внутри прокрутки добавьте простой старый UIView в качестве контейнера. Ограничить его ко всем 4 краям зрения прокрутки, но и добавить равную ширине ограничений относительно прокрутки вид, и равной высоте ограничением для зрения прокрутки

3) Очень важно: установить низкий приоритет для ограничение равной высоты, например 250.

4) в представлении контейнера, которое вы добавили на шаге 2, добавьте 3 модуля. Ограничьте верхний край первого модуля в верхней части представления контейнера, ограничьте нижний край последнего модуля в нижней части представления контейнера и ограничите все промежуточные модули предыдущим модулем в цепочке. Это должно дать вам целую цепочку неразрывных вертикальных ограничений внутри контейнера. Вам также необходимо будет добавить любые подходящие ограничения по установке/ширине помех для каждого модуля.

5) Сборка и запуск! Размер содержимого вашего прокрутки должен автоматически быть равен общей высоте всех модулей плюс расстояние между ними, а динамическое изменение содержимого модуля будет обновлять размер содержимого прокрутки с помощью автоматического макета, а не требовать, чтобы явный код вычислял и обновлял.

+0

Низкий приоритет для ограничения равной высоты сделал трюк! Большое спасибо! – karenms

+2

вы спасли день спасибо! –

+0

Я использовал Scrollview некоторое время, но не знал о пункте 3. Большое спасибо. – Ankit

0

Постарайтесь определить высоту времени выполнения модулей и программно установить автоматическое ограничение размещения модулей.

#define kDeviceHeight     [UIScreen mainScreen].bounds.size.height 
#define kDeviceWidth     [UIScreen mainScreen].bounds.size.width 

    - (void)viewDidLoad { 

     [super viewDidLoad]; 
     [self setScrollViewHeight]; 

    } 

    -(void)setScrollViewHeight{ 

     float module1_Height,module2_Height,module3_Height;// Calculate the height of modules over here and assign it to respective variables 
     float viewVerticalSpacing = 5; // Provides space between two views 
     float YAxis = 0; 
     module1View.frame = CGRectMake(0, 0, kDeviceWidth, module1_Height); 

     YAxis = YAxis + module1_Height + viewVerticalSpacing; 
     module2View.frame = CGRectMake(0, YAxis, kDeviceWidth, module2_Height); 

     YAxis = YAxis + module2_Height + viewVerticalSpacing; 
     module3View.frame = CGRectMake(0, YAxis, kDeviceWidth, module3_Height); 

     float scrollView_height = YAxis + module3_Height + viewVerticalSpacing; 
     scroll_view.contentSize = CGSizeMake(kDeviceWidth, scrollView_height); 
     scroll_view.frame = CGRectMake(0, 0, kDeviceWidth, kDeviceHeight); 
    } 
0

Для меня решение Daniel было очень полезно, но не работало. Вот обновленные шаги:

1) В раскадровке добавить представление прокрутки и ограничить ее края к краям основного вида или в любой способ подходит

2) Внутри зрения прокрутки, добавить простой старый UIView как контейнер. Ограничить его ко всем 4 краям зрения прокрутки, но и добавить равное ограничение ширины относительно прокрутки родительского (самый высокий вид) View, и равное ограничение высоты для родителя зрения скроллинга

3) Очень важно, : установить низкий приоритет для ограничения равной высоты, например 250.