2013-10-08 3 views
2

У меня есть scrollview, у которого есть два подглядывания (iPad). Иерархия зрения выглядит следующим образом:UIScrollview не будет прокручиваться при использовании Autolayout

-- UIScrollView 
    -- UIView1 
    -- UIView2 

кадр UIScrollView является размер экрана, рамка UIView1 также размер экрана, но кадр UIView2 является (0,0,768,2000).

Прокрутка не прокручивается по вертикали. Согласно документации на яблоко, scrollview должен автоматически устанавливать свой размер содержимого. Может ли кто-нибудь помочь мне решить эту проблему, так как размер контента не устанавливается должным образом?

P: S: Когда я использую один вид внутри прокрутки и устанавливаю правильное ограничение по вертикали, он прокручивается правильно.

+0

Как вы устанавливаете ограничения для каждого из подзонов? –

+0

Когда вы встраиваете представление в UIScrollView в InterfaceBuilder, тогда автоматически устанавливается ограничение. Если ваш вид «длиннее», чем экран в портрете, он вообще не будет прокручиваться. Чтобы получить доступ к UIScrollView в AutoLayout, просмотрите ваши ограничения. Найдите «Вертикальное пространство - Просмотр прокрутки - Просмотр» и установите его с «константой» на «авто» – Basant

+0

показать свои константы взглядов –

ответ

0

Главная точка: Ошибка в наборе 'contentSize' из 'UIScrollView', вам необходимо установить вручную.

Как кажется, в вашем вопросе

вид прокрутки кадра = рамка экрана,
вид 1 кадр = рамка экрана,

Его хорошо, но

view 2 frame = (0,0,768,2000), тогда перекрывание на первый взгляд, потому что ваш view2 x, y позиция (0,0), так что может быть ваш первый вид не будет отображаться.

Если вы хотите вертикально добавить вида 1 после обзора 2, то ваш кадр вида 2 должен быть

view2.frame = CGRectMake(0,view1.frame.origin.y + view1.frame.size.height , 768,2000); 

И после того, как добавил оба зрения, то вам нужно управлять contentSize из UIScrollView, в вашем случае, такие как

scrollView.contentSize = CGSizeMake(768, view1.frame.origin.y + view1.frame.size.height + 2000) 

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

+0

YEs перекрытие представления, у меня есть функция, где я должен держать этот вид скрытым и просто заполнять некоторые данные и сделать из него pdf. Так что это не проблема, а требование. Кроме того, я попытался установить contentSize в viewDidload, который, как я знаю, не является правильным подходом, не работал. При установке contentSize в viewDidAppear, опять же неправильном подходе, работала на iOS 6, но не работала на iOS 7. Уверен, что есть способ сделать автозапуск установленным contentSize в соответствии с самым верхним видом в scrollView. – Basant

2

Scrollview не будет прокручиваться, если вы включите авторазметки. Технически при прокрутке все элементы в scrollview меняют свое положение. Поэтому используйте автоматическую компоновку, если вы фиксируете положение элементов в scrollview.

Вместо этого используйте UIView в виде контейнера внутри scrollview, который содержит все другие объекты, такие как кнопка, метка, изображение и т. Д. И тогда вы сможете прокручивать.

Проверьте ссылку ниже для более подробной информации: https://developer.apple.com/library/ios/technotes/tn2154/_index.html

В ваших проблемах попробуйте поставить правильные значения размера контента. Также проверьте, включена ли вертикальная прокрутка или нет.

+0

Помещение представления содержимого внутри scrollview - это решение, но есть ли несколько представлений, например, есть scrollView и позволяет сказать две метки, которые я размещаю прямо на scrollView? Возможно, я ошибаюсь, но решение должно быть лучше, чем это. – Basant

+2

Возможными решениями для этого является UIScrollView с UIView как containerSubView. Чем вы можете добавить еще 2 UIViews или любой другой объект, который вам нужен в этом контейнереSubView. Это определенно сработает. У вас должен быть только один непосредственный subView для scrollview, который является containerSubView и DONE :) – Geekoder

+0

Chinab, решение, которое вы предложили, является тем, которое я использую прямо сейчас. И это работает, но я опасаюсь использования дополнительных просмотров здесь. И это очень распространенный сценарий, мы просто добавляем некоторые вещи в scrollview, но мы не добавляем ContentView всегда. – Basant

0

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

+0

Вам не нужно устанавливать размер содержимого, когда вы используете автозапуск, он автоматически устанавливает размер содержимого в соответствии с представлением в scrollView. – Basant

2

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

Вертикально, у вас должно быть какое-то ограничение, связывающее ваш View1 с видом прокрутки вверх, еще один, который привязывает ваш View2 к представлению прокрутки внизу, а третья - устанавливает вертикальное пространство между View1 и View2. Также убедитесь, что сами представления (View1 и View2) имеют ограничения для их высот.

Горизонтально выведите один из видов на вид прокрутки в переднем и заднем пространстве, а другой - влево и вправо на первый (чтобы они имели равную ширину).

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

1
  1. Использование contentSize свойства прокрутки в коде. Лучший способ заключается в использовании метода 'viewDidLayoutSubviews'

    • (пустоты) viewDidLayoutSubviews { [супер viewDidLayoutSubviews]; _scrollView.contentSize = CGSizeMake (568, 594); }

2.Always сделать горизонтальное пространство> = 0 между самой низкой из внутренних представлений и видом прокрутки. Автоматически автоматический макет делает такие предложения, как «-160», и это отрицательное пространство не будет прокручиваться.

+0

Point 2 save мои 4 часа спустя имели почти 10 неудачных попыток с другими ответами! благодаря –

Смежные вопросы