UIScrollView не прокручивается полностью

У меня есть ViewController. В нем я помещаю ScrollView с представлением (contentView). Позже я перетаскиваю из contentView в View и устанавливаю Equal Height. Теперь прокручивается, но не полностью.

введите здесь описание изображения

введите здесь описание изображения

Как вы видите, он продолжается ниже textView, но не прокручивается. Как я могу это исправить?


person Orkhan Alizade    schedule 10.07.2015    source источник
comment
Вы установили размер содержимого прокрутки?   -  person Leo    schedule 10.07.2015
comment
@ Лео нет. Я хочу сделать это автоматически, но не знаю, как это сделать. Вы можете помочь мне?   -  person Orkhan Alizade    schedule 10.07.2015
comment
Поскольку он использует Auto Layout, ему не нужно устанавливать contentSize. Вы устанавливаете высоту contentView равной высоте просмотра, почему она должна прокручиваться?   -  person GaétanZ    schedule 10.07.2015
comment
@Poql это неправильно?   -  person Orkhan Alizade    schedule 10.07.2015
comment
@Poql независимо от того, используете ли вы автоматическую компоновку или нет, вы ДОЛЖНЫ установить размер содержимого, который по умолчанию равен (0, 0)   -  person Nico    schedule 10.07.2015
comment
Неправильный. apeth.com/iOSBook/ch20.html   -  person GaétanZ    schedule 10.07.2015
comment
@Nico Я попробовал ответ Сохила ниже, и он мне тоже не помогает   -  person Orkhan Alizade    schedule 10.07.2015
comment
@Poql да, ты прав, мой плохой.   -  person Nico    schedule 10.07.2015


Ответы (4)


UIScrollView может автоматически вычислять высоту и ширину содержимого, но вам нужно помочь ему в этом. Для этого вам необходимо:

  1. Связано contentView (в вашем случае) со всеми сторонами супервизора (то есть Scroll View).
  2. Пусть contentView рассчитает его размеры. Вот небольшая ошибка в вашем подходе. Вы установили высоту contentView равной высоте View. Таким образом, в основном contentSize.height Scroll View совпадает с высотой View. Это не совсем то, что вы хотите с динамическим контентом.

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

В вашем случае я бы связал:

  • pizza.jpg влево-вверх-вправо супервида (высота pizza.jpg будет установлена ​​из внутреннего размера изображения);
  • SAMPLE TITLE метка - влево-вправо для супервизора; сверху на pizza.jpg изображение;
  • Text View - левый-нижний-правый для супервизора; сверху до метки SAMPLE TITLE; установить фиксированную высоту.

В этом случае contentView сам определит необходимую высоту. Scroll View соответственно установит свой contentSize. И ваш экран сможет прокручиваться вертикально (так и должно быть) ;)

person Nevs12    schedule 10.07.2015
comment
Правильный ответ после изучения в течение нескольких часов. Вы спасли мой день. Ключевым моментом является установка нижнего ограничения самого нижнего на нижнюю часть представления содержимого. - person Atreidex; 23.07.2020

Вам нужно установить размер содержимого прокрутки. Для этого используйте приведенный ниже код:

func viewDidLayoutSubviews()
{
    super.viewDidLayoutSubviews()
    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.contentView.frame.size.height);

}
person Sohil R. Memon    schedule 10.07.2015
comment
мне это не помогает. Должен ли я удалить свое ограничение - равная высота или нет? я его удаляю а он вообще не прокручивается - person Orkhan Alizade; 10.07.2015
comment
@OrkhanAlizade Для contentView вам просто нужно установить перспективу ограничения для просмотра прокрутки. Сверху = Снизу = Слева = Справа = 0 - person Sohil R. Memon; 10.07.2015

Использовать Autolayout с UIScrollView сложно.

В вашем коде вы должны обновить ограничение высоты для вашего contentView, вычислив высоту subviews из contentView, и это автоматически обновит contentSize для вашего ScrollView, и вы сможете прокручивать все подвиды.

Для получения дополнительной информации об использовании Autolayout+UIScrollView вы можете прочитать это.

person Yuvrajsinh    schedule 10.07.2015

Согласно этой ссылке (спасибо до сначала этот ответ Мэтта), UIScrollView действует с AutoLayout иначе, чем с другие взгляды.

Подпредставления scrollView устанавливают свои ограничения из contentView scrollView, а не непосредственно из прокрутки. Это позволяет прокручивать содержимое.

So :

  1. Добавьте UIView в свой scrollView, это будет представлять contentView вашего scrollView. Добавьте ограничения сверху, снизу, в конце, в направлении от представления к его суперпредставлению.
  2. Интерфейсный Разработчик жалуется. Здесь вы видите разницу между базовым представлением и scrollView. Причина в том, что contentView должен быть заполнен, чтобы узнать его размер. Поэтому добавьте равную ширину от contentView до scrollView
  3. ContentView теперь знает свою ширину, но не высоту. Поэтому добавьте свои метки и свой UIImage в качестве подвидов contentView. Добавляйте ограничения снизу вверх. Не забудьте добавить ограничение по высоте в UIImageView.

Это должно выглядеть так:

введите здесь описание изображения

Надеюсь это поможет

Прочтите это (от Мэтта еще раз) для получения дополнительной информации.

person GaétanZ    schedule 10.07.2015