Як користуватися UIScrollView у Storyboard


125

У мене подання прокрутки із вмістом у висоту 1000 пікселів, і я хотів би мати можливість викласти його для зручного дизайну на дошці розкадрування.
Я знаю, що це можна зробити програмно, але мені дуже хочеться це бачити візуально. Кожен раз, коли я кладу подання прокрутки на контролер перегляду, він не прокручується. Чи можна змусити його працювати так, як я хочу, або я повинен це робити в коді?


1
Привіт усім, будь ласка, дивіться коментарі нижче, щоб дізнатися про нові способи цього зробити. Я писав це 2 роки тому і xCode сильно змінився. Є й інші способи зробити це зараз, тому майте на увазі. Рішення для iOS 7 та iOS 8, запропоновані у коментарях
Алекс Рейнольдс

Ось я знову через 2 роки все ще отримую коментарі про те, як це не працює, або краще автоматичний розклад. Первісне питання полягало в тому, як це зробити в ios 5/6. Я використовую для цього лише авторозкладку в цей день, тому ви також повинні / можете. Дивіться відповіді на автоматичному розкладі за допомогою. Будь ласка, оновіть відповіді на автоматичний розклад, якщо вони корисні. Дякую всім
Алекс Рейнольдс

Відповіді:


149

Я відповідаю на власне питання, тому що я просто витратив 2 години на пошук рішення, і StackOverflow дозволяє цей стиль QA.

Почніть закінчувати тут, як змусити його працювати в раскадровці.

1: перейдіть до контролера перегляду та натисніть на Attribute Inspector.

2: зміни розміру на Freeformзамість Inferred.

3: Перейдіть до основного огляду на цій дошці розкадрування, а не до перегляду прокрутки, а до подання верхнього рівня.

4: Клацніть Size Inspectorта встановіть цей вид на потрібний розмір. Я змінив зріст до 1000.

Тепер ви побачите, що у вашій рекламній дошці є налаштування перегляду, щоб ви могли бачити всю висоту прокрутки для легкого проектування.

5: Опустіться на прокрутку і розтягніть його, щоб він зайняв весь вид. Тепер у вас повинен бути перегляд прокрутки розміром 320,1000, який сидить на поданні у контролері перегляду.

Тепер нам потрібно зробити його прокруткою і потрібно, щоб він відображав вміст правильно.

6: Клацніть на ваш список прокрутки та натисніть на Identity Inspector.

7: Додайте User Defined runtime attributeз KeyPath contentSizeпотім тип SIZE та введіть розмір вмісту. Для мене це (320, 1000).

Оскільки ми хочемо побачити весь перегляд прокрутки на дошці розкадрів, ми розтягнули його, і він має рамку 320,1000, але для того, щоб це працювало в нашому додатку, нам потрібно змінити кадр вниз, яким буде видимий прокрутки.

8: Додайте runtime attributeKeyPath frameз типом RECT та 0,0,320,416.

Тепер, коли ми запустимо наш додаток, у нас буде видимий прокрутка, який має рамку 0,0320, 416 і може прокручуватися до 1000. Ми можемо компонувати наші підгляди та зображення, а також те, що не так у Storyboard, як ми їх бажаємо. Тоді наші атрибути виконання обов'язково відображають його належним чином. Все це без 1 рядка коду.


5
Якщо ви правильно користуєтеся функцією автоматичного розміщення прокрутки, тоді не потрібно визначати frameатрибут. Дійсно, всі пристрої не мають точно однакового розміру (iPhone 5).
Tronix117

Tronix117, то як ви вирішите цю проблему без цього атрибута?
Андрас Хатвані

2
Якщо у вас є рішення для iOS 7, дайте мені знати. Ця відповідь була опублікована більше року тому перед iOS 7. Мене заболочено, інакше я б оновив це для iPhone5 та ios7
Alex Reynolds

2
Примітка: Рішення для FOR iOS7 вниз нижче stackoverflow.com/a/22489795/1553014
Раджа Рао

1
Примітка: Для IOS 8,3 XCode 6,3, відповідь тут: stackoverflow.com/questions/26742230 / ...
T.Coutlakis

51

Ось етапи, Auto Layoutякі працювали для мене на XCode 8.2.1.

  1. Виберіть Size Inspectorз View Controller, і зміни Simulated Sizeдо Freeformз висотою 1000 замість Fixed.
  2. Перейменуйте представлення View Controllerяк RootView .
  3. Перетягніть a Scroll Viewяк підвід RootView і перейменуйте його як ScrollView .
  4. Додати обмеження для ScrollView :
    • ScrollView [Вгору, Нижній, Ведучий, Задній ] = RootView [Верх, Нижній, Ведучий, Задній]
  5. Перетягніть a Vertical Stack Viewяк підвідміток ScrollView і перейменуйте його як ContentView .
  6. Додати обмеження для ContentView :
    • ContentView .висота = 1000
    • ContentView [вгорі, знизу, провідний, нижній, ширина] = ScrollView [вгорі, знизу, провідний, задні, ширина]
  7. Виберіть Attributes Inspectorз ContentView , і змінити Distributionдо Fill Equallyзамість Fill.
  8. Перетягніть Viewяк підпідміст ContentView і перейменуйте його як RedView .
  9. Встановіть Redяк фон RedView .
  10. Перетягніть Viewяк підпідміст ContentView і перейменуйте його як BlueView .
  11. Встановіть Blueяк фон BlueView .
  12. Виберіть RootView і натисніть Update Framesкнопку.
    • Update Framesце нова кнопка в Xcode8, а не Resolve Auto Layout Issuesкнопка. Це схоже на кнопку оновлення, розташовану на панелі керування під дошкою розгортки: Кнопка оновлення кадрів

Переглянути ієрархію:

  • RootView
    • ScrollView
      • ContentView
        • RedView
        • BlueView

Перегляд сцени контролера (висота: 1000):

сцена

Запустити на iPhone7 (зріст: 1334/2):

демонстрація


У мене виникає те саме питання, і мені цікаво, чи не спрацює це, якщо мій перегляд прокрутки не має розмір rootview?
GalaxyVintage

Але річ у тому, що у неї буде порожнє місце внизу для ipad
G.Abhisek

Примітка щодо встановлення BlueViewверхньої RedViewта нижньої частини для початківців, як я (Xcode 8.2): 1) Перетягніть BlueView нижче RedView (тобто вони не повинні перетинатися або робити крок 4) не буде працювати). 2) Відкрийте контактне меню внизу. 3) Клацніть маленьку стрілку праворуч від верхнього обмеження поля. 4) Виберіть RedViewу цьому меню і встановіть значення 0. Це відрізняється від попередніх версій Xcode, де ви могли робити такі речі, як Editor-> Pin-> ...
Krøllebølle

просто цікаво, чому ви використовуєте вертикальний перегляд стека замість звичайного UIView?
Changerrs

@Changerrs я використовую, UIStackViewщоб уникнути проблем із встановленням обмежень.
jqgsninimo

43

Ось кроки, які працювали для мене на iOS 7 та XCode 5.

  1. Перетягніть ViewController (він поставляється з UIView "Перегляд").

    1.1 Виберіть "Переглянути контролер" та виберіть "Інспектор файлів" та зніміть прапорець "Автоматичне розташування".

  2. Перетягніть ScrollView (як дочіння UIView ViewController у "Вид")
  3. Виберіть ScrollView та відкрийте "Інспектор посвідчення особи".
  4. Введіть "contentSize" для keyPath. Виберіть "Розмір" для типу. І введіть {320, 1000} для значення.

    Примітка: крок 4 - це просто сказати, що скроллер містить деякий вміст, розмір якого становить 320x1000 одиниць. Таким чином, встановлення contentSize змусить роботу прокрутки.

  5. Виберіть «Контролер перегляду», виберіть «Інспектор атрибутів», а потім виберіть « Вільна форма» з «Розмір».

    Примітка: крок 5 дозволить нам змінити розмір "Вид", з яким постачається контролер перегляду.

  6. Виберіть "Перегляд", а потім виберіть "Інспектор розміру".

  7. Встановіть Ширину на 320, а висоту - на 1000.

Примітка: 5, 6 і 7 суто для нас, щоб побачити розтягнутий або весь розгорнутий вигляд всередині StoryBoard. Примітка. Переконайтесь, що зніміть позначку "Автоматична компонування" на контролері подання.

Ієрархія перегляду повинна виглядати так: ієрархія


3
Ця методика як і раніше працює як у Xcode 6.1 та iOS 8.1.
Кріс Харріс

1
Дивовижний. Дякую за це Однозначно працює на Xcode 6.1 та iOS 8.1, як згадувалося.
Шенкер Каура

45
Гаразд ... а як же бути, якщо ми потребуємо автоматичного розкладу?
PostCodeism

1
Муч краще відповісти .. Дякую!
StefMa

1
Рішення для IOS 8 Автокомпоновкі і класу розміру stackoverflow.com/questions/26742230 / ...
jithin

13

Після годин спроб та помилок я знайшов дуже простий спосіб вкласти вміст у перегляди прокрутки, які є "поза екраном". Тестовано за допомогою XCode 5 та iOS 7. Ви можете це зробити майже повністю у дошці розповідей, використовуючи 2 невеликих трюки / обхідні шляхи:

  1. Перетягніть контролер перегляду на свою раскадровку.
  2. Перетягніть прокруткуView на цей виглядController, для демонстрації ви можете залишити його розмір за замовчуванням, охоплюючи весь екран.
  3. Тепер приходить хитрість 1 : перш ніж додати будь-який елемент до scrollView, перетягніть звичайний "перегляд" (цей вид буде зроблено більше, ніж екран, і буде містити всі під елементи, такі як кнопки, мітки, ... назвемо це ' додаючий вигляд ').
  4. Нехай цей розмір Y переглядає розмір Y в інспекторі розмірів, наприклад, 800.
  5. Запустіть мітку на доданий вигляд, десь у позиції Y, назвіть її "мітка 1".
  6. Трюк 2 : переконайтесь, що вибрано подаюче вікноне scrollView! ) Та встановіть його Y-положення, наприклад, -250, щоб ви могли додати елемент, який знаходиться "поза" екрана
  7. Опустіть етикетку, десь внизу екрана, назвіть її "мітка 2". Ця мітка насправді "поза екраном".
  8. Скиньте положення Y вкладеного подання на 0, ви більше не побачите мітку 2, оскільки вона була розташована поза екраном.

Наразі для роботи на раскадровці тепер вам потрібно додати єдиний рядок коду до методу "viewDidLoad" viewController, щоб встановити вміст scrollViews, щоб він містив весь "додаючий вигляд". Я не знайшов способу зробити це на «Розгортці»:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scrollView.contentSize = CGSizeMake(320, 800);
}

Ви можете спробувати це зробити, додавши contentSizekeyPath як a sizeдо scrollView в Інспекторі ідентичності та встановивши його на (320, 1000).

Я думаю, що Apple має полегшити це у розробці таблиць, у TableViewController ви можете просто прокручувати екран на Storyboard (просто додайте 20 комірок, і ви побачите, що ви можете просто прокручувати), це також можливо для ScrollViewController.


1
це правильно jaxvy, коли я нещодавно імпортував свою програму для підтримки автоматичного макета, я замінив перегляд прокрутки статичним поданням таблиці. Робить ту саму роботу, і має деякі додаткові переваги.
Ронні Веберс

Що про зміну contentSize динамічно , тому що все айфони поставляються з різними розмірами
veeresh kumbar

8

Початок прокрутки для роботи в iOS7 та Авто-макет у iOS 7 та XCode 5.

Додатково до цього: https://stackoverflow.com/a/22489795/1553014

Мабуть, все, що нам потрібно зробити:

  1. Встановити всі обмеження для перегляду прокрутки (тобто спочатку виправити подання прокрутки)

  2. Потім встановіть обмеження відстані від-scrollView до самого нижнього елемента для перегляду прокрутки (що є супервидом).

Примітка. Крок 2 розповість рекламну дошку, де останній фрагмент вмісту лежить у вікні прокрутки.


7

У цьому прикладі я скасував функцію автоматичного вимикання конструктора інтерфейсів. І я все ще використовую (без жодної причини) відносно стару 4.6.1 версію Xcode.

Почніть з контролера перегляду, який має вигляд прокрутки над ним (основний вид).

1: Додайте перегляд контейнера з бібліотеки об'єктів до подання прокрутки. Зауважте, що до контрольної панелі додано новий контролер перегляду, який пов'язаний з контролером перегляду разом із поданням прокрутки.

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

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

3: Змініть його висоту на 1000. (У цьому прикладі використовується 1000. Ви повинні застосувати необхідне вам значення.)

4: Виберіть новий контролер перегляду та, з інспектора атрибутів, змініть розмір на вільну форму.

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

5: Виберіть подання нового контролера перегляду та, за розміром Inspector, змініть висоту до 1000 (що дорівнює висоті подання контейнера).

6: Для подальшого тестування, перебуваючи в режимі перегляду нового контролера подання даних, додайте мітку вгорі та внизу подання.

7: Виберіть подання прокрутки з оригінального контролера перегляду. У інспекторі ідентичності додайте атрибут із набором keyPath до contentSize, введіть значення Розмір і значення, встановлене на {320, 1000} (або розмір перегляду контейнера).

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

8: Запуск на 4-дюймовому iPhone Simulator. Ви повинні мати можливість прокрутки від верхньої мітки до нижньої.

9: Запуск на 3,5-дюймовому iPhone Simulator. Ви повинні мати можливість прокрутки від верхньої мітки до нижньої.

Пам'ятайте, що Xcode 4.6.1 може бути створений лише для iOS6 та нижче. Використовуючи такий підхід і будуючи для iOS6, я все ще в змозі досягти тих же результатів, коли додаток запускається на iOS7.


5

Зауважте, що в межах UITableViewви можете фактично прокручувати перегляд таблиці, вибравши комірку або елемент у ній і прокручуючи вгору або вниз за допомогою трекпада.

Наприклад UIScrollView, мені подобається пропозиція Алекса, але я рекомендую тимчасово змінити контролер перегляду на вільну форму, збільшити висоту кореневого виду, побудувати інтерфейс користувача (кроки 1-5), а потім змінити його на стандартний розмір висновку, коли закінчите так що вам не доведеться жорстко розміщувати вміст коду в якості атрибутів виконання. Якщо ви це зробите, ви відкриваєте перед собою чимало проблем із технічним обслуговуванням, намагаючись підтримати пристрої 3,5 "та 4", а також можливість збільшення дозволу екрана в майбутньому.


4

Ви повинні встановити лише властивість contentSize на viewDidAppear, як у цьому зразку:

- (void)viewDidAppear:(BOOL)animated{

     [super viewDidAppear:animated];
     self.scrollView.contentSize=CGSizeMake(306,400.0);

}

Він вирішує проблеми з авторозміткою та чудово працює на iOS7.


ПРИМІТКА. Алекс Заватоне надає альтернативний спосіб встановлення contentSize, без написання коду.
ToolmakerSteve

4

Відмова від відповідальності: - Тільки для iios 9 і вище (Stack View).

Якщо ви розгортаєте додаток на пристроях ios 9, використовуйте подання стека . Ось такі кроки: -

  1. Додайте подання прокрутки з обмеженнями - шпильками вліво, вправо, внизу, вгорі (без поля) для перегляду (перегляду)
  2. Додайте подання стека з однаковими обмеженнями, щоб переглянути подання прокрутки.
  3. Перегляд стека Інші обмеження: - stackView.bottom = view.bottom та stackView.width = scrollView.width
  4. Почніть додавати свої уявлення. Перегляд прокрутки вирішить прокручувати залежно від розміру подання стека (який, по суті, є переглядом вмісту)

1
Це корисна методика, яка мінімізує кількість обмежень, які вам доведеться додати вручну. Взагалі спосіб прокрутки полягає в тому, щоб забезпечити достатню кількість обмежень для авторозкладки для обчислення розміру вмісту. Перегляд стека робить для вас багато того, що обмежує. Встановіть стек, spacingщоб розмістити пробіл між підглядами (діти). Якщо вам потрібно більше місця між двома підпереглядами, додайте дочірник "прокладки": прозорий UIView з фіксованим розміром.
ToolmakerSteve

4

У iOS7 я виявив, що якби у мене було перегляд UIScrollView на ViewController розміром FreeForm, він не прокручується в додатку, що б я не робив. Я пограв і виявив, що працює таке, що не використовує FreeForms:

  1. Вставте UIScrollView у головний вигляд ViewController

  2. Встановіть обмеження для автоматичного вимикання на ScrollView відповідно. Для мене я використав посібник від 0 до верхніх макетів і 0 до керівництва по макеті знизу

  3. Всередині ScrollView розмістіть Перегляд контейнерів. Встановіть його висоту на все, що завгодно (наприклад, 1000)

  4. Додайте в контейнер обмеження висоти (1000), щоб воно не змінило розмір. Дно буде минулим наприкінці форми.

  5. Додайте рядок [self.scrollView setContentSize: CGSizeMake (320, 1000)]; до ViewController, який містить scrollView (який ви підключили як IBOutlet)

ViewController (додається автоматично), пов'язаний з контейнером, матиме бажану висоту (1000) в Interface Builder, а також буде правильно прокручуватися в оригінальному контролері подання. Тепер ви можете використовувати контейнер ViewController для компонування елементів керування.


Я відповів на цю відповідь, тому що мені подобається техніка; однак я вважаю, що ви помиляєтесь про те, що FreeForm VC заважає прокручувати незалежно від версії iOS. Починаючи з прошивкою 6 (який додав Auto Layout), повний набір обмежень, як описано в інших відповідях, буде прокручувати. Я не думаю, що FreeForm втручається в це (хоча я цього не пробував). Можливо, ви пропустили якесь не очевидне обмеження; ScrollView + AutoLayout - це трохи хак.
ToolmakerSteve

3

Я хочу поставити свої 5 центів на прийняту відповідь: я досліджував тему протягом 2 днів і, нарешті, знайшов рішення, яке я буду використовувати завжди відтепер

перейдіть до пункту 4 у прийнятій відповіді та забудьте про додавання атрибутів фреймів та змісту тощо

щоб зробити все автоматичним, просто використовуйте рішення за цим посиланням

все зрозуміло, легко, елегантно і працює як шарм на ios 7. Я дуже радий з усім, що lol



ваше рішення (якщо ви переходите за своїм посиланням до кінця) передбачає додавання коду, тому це не особливо відповідає питанню - використовуючи лише розкадровку
Борис Гафуров

@BorisGafurov все-таки трохи не застарів з ios7. і mb це не в черзі, але я впевнений, що він допоміг пару ppls у будь-якому випадку .. так нехай це буде
jungle_mole

3

Ось просте рішення.

  1. Встановіть атрибут розміру контролера перегляду на дошці розкадрівки на "Freeform" та встановіть потрібний розмір. Переконайтеся, що він достатньо великий, щоб вмістити повний вміст вашого виду прокрутки.

  2. Додайте подання прокрутки і встановіть обмеження, як зазвичай. наприклад, якщо ви хочете, щоб вид прокрутки був розміром вашого перегляду, тоді додайте верхній, нижній, провідний, кінцеві поля до огляду, як зазвичай.

  3. Тепер просто переконайтесь, що в підвидах перегляду прокрутки є обмеження, які з'єднують верхній і нижній частині подання прокрутки. Те саме для лівої та правої, якщо у вас горизонтальна прокрутка.

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


2

Ось трохи нечіткої відповіді, яка стосується того самого рішення для вертикальних поглядів прокрутки, але (проти етосу stackoverflow) не відповідає на питання. Замість того, щоб використовувати scrollView, просто використовуйте UITableView, перетягніть звичайний UIView в заголовок і зробіть його таким же великим розміром, як тепер, ви можете прокручувати вміст у раскадровці.


ІМХО, його прекрасний відповідь, а НЕ проти етосу StackOverflow, в запропонувати альтернативний підхід (якщо OP конкретно не каже , що вони повинні робити це так , як вони просять о.) І найбільше значення StackOverflow допомагає у всіх інших людей , які приходять разом і читати питання та відповіді. :)
ToolmakerSteve

1

Ось як налаштувати прокрутку за допомогою Xcode 11

1 - Додайте перегляд прокрутки та встановіть обмеження на верхній, нижній, ведучий та останній

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

2 - Додайте перегляд вмісту до перегляду прокрутки, перетягніть підключення до Посібника з вмісту вмісту та виберіть Провідні, Вгорі, Нижні та Задні. Не забудьте встановити його значення "0" або потрібні константи.

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

3 - Перетягніть зображення з вмісту до Посібника з компонування кадру та виберіть Рівні ширини

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

4 - Встановіть константу обмеження висоти для перегляду вмісту


0

Мабуть, вам зовсім не потрібно вказувати висоту! Що чудово, якщо воно зміниться з якоїсь причини (ви зміните розмір компонентів або зміните розміри шрифту).

Я тільки дотримувався цього підручника і все працював: http://natashatherobot.com/ios-autolayout-scrollview/

(Бічна примітка. Не потрібно реалізовувати viewDidLayoutSubviews, якщо ви не хочете централізувати подання, тому список кроків ще коротший).

Сподіваюся, що це допомагає!


0

Ключовим є contentSize.

Це часто відсутнє і не вказується при додаванні UIScrollView.

Виберіть UIScrollView та виберіть інспектор посвідчення особи.

Додайте contentSizekeyPath як a sizeдо scrollView в Інспекторі ідентичності та встановіть його на (320, 1000).

Прокрутіть геть.


Це один підхід, і я сам його застосував. Однак я не вважаю це кращим підходом. Це "чистіший / гнучкіший", щоб забезпечити повний набір обмежень, таким чином, що авторозкладка може сама обчислювати розмір вмісту. Три варіанти: обмеження зверху до низу , або використання подання стека , або обмеження позиції нижнього елемента .
ToolmakerSteve

0

Якщо ви використовуєте автоматичну компоновку, найкращим підходом є використання UITableViewController зі статичними осередками в раскадровці.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.