як я можу використовувати UIScrollView у Interface Builder?


95

Хоча я раніше UIScrollViewуспішно використовував, програмно маніпулюючи ним, у мене виникають проблеми з тим, щоб він працював, налаштовуючи його виключно в Interface Builder.

У моїй програмі для iPhone є проста сторінка "про". У ньому є UITextViewдеякі іконки та посилання на інші мої програми. Я додав усі ці подання до свого UIScrollView, розташувавши їх так, щоб їх загальний розмір становив> 480. Коли я запускаю свою програму, прокрутка відображає лише вміст, який вміщується на екрані, і нічого не прокручується.

Чи можливо це зробити повністю через IB, чи я повинен маніпулювати contentSize за допомогою коду?

Відповіді:


130

Ви забули встановити властивість contentSize для UIScrollView. Як не дивно, але ви не можете цього зробити за допомогою Interface Builder. Вам доведеться це зробити за допомогою контролера подання, який керує цим видом прокрутки.


42
Ого, це робить IB досить, безглуздим ... Це зробило фокус, дякую.
Джордж Армгольд,

20
Ви можете створити підклас UIScrollvView, який перевіряє, чи є лише один підпрогляд на (0,0), а потім автоматично встановлює contentSize на основі цього підпрогляду.
Stefan Arentz

1
Це найкраща порада, яку я отримав за деякий час. Я не міг зрозуміти, чому мій вид прокрутки не працював, і не знайшов цієї інформації про contentSize ніде. Дякую.
Drew C

46
Я намагався зрозуміти, як встановити contentSize у Interface Builder, і знайшов це обговорення. Принаймні для мене, у Xcode 4.5, я можу встановити його за допомогою "Визначених користувачем атрибутів виконання", додавши запис із іменем contentSizeтипу Sizeта встановивши бажане значення.
nlogax

5
Мене все ще бентежить питання про те, чому iOS не просто автоматично встановлює режим contentSizeпрокрутки на основі розмірів своїх підпрограм , принаймні як поведінку за замовчуванням.
aroth

113

Відповідь Boby_Wan змусив мене замислитися, і я знайшов наступне рішення для налаштування UIScrollView's contentSize із Interface Builder:

  1. Виберіть UIScrollViewу сцені розкадрування
  2. Перейдіть до інспектора посвідчень , створіть новий визначений користувачем атрибут виконання (натисніть кнопку +)
  3. Змініть атрибут Ключовий шлях наcontentSize
  4. Змініть атрибут Type наSize
  5. Тепер встановіть значення { бажана ширина вмісту , бажана висота вмісту }

наприклад, встановлення значення {320, 920} дозволить користувачеві прокрутити весь додатковий екран на iPhone.

(Я використовую xcode 4.3.3, ціль розгортання iOS проекту - 5.1)

Коли я вперше зробив це, я отримав таку помилку:

Незаконне налаштування:
     визначений користувачем атрибути часу виконання з версіями Xcode до 4.3
     MainStoryboard.storyboard

Якщо ви теж отримуєте цю помилку, виправити це просто: виберіть Розкадрування в Навігаторі проектів і відкрийте інспектор файлів . Знайдіть / розгорніть розділ « Документ конструктора інтерфейсів» , і з’явиться спадне меню « Розробка» . Переконайтеся, що для цього встановлено значенняXcode 4.3


7
Чудова знахідка! PS: Я вражений тим, що це найкраще, що може зробити Apple. Я думаю, це свідчить про те, що навіть співробітники Apple ніколи не використовують власний інструмент (конструктор інтерфейсів) :).
Адам

Блискуче, це щойно працювало для мене в Xcode 4.4. Але як мені зараз розмістити кнопки на тій частині області прокрутки, яку я не можу «побачити» в IB?
Роберт Аткінс,

1
Я щойно це розробив - вам потрібно звільнити перетягування, коли вказівник все ще знаходиться всередині "екрану", інакше він повернеться назад, коли ви починали з. Який біль.
Роберт Аткінс

Я спробував це таким чином, але я отримую повідомлення про помилку. Чи "this class is not key value coding-compliant for the key keyPath"можете ви допомогти мені, що я роблю не так? зверніть увагу, що я використовую xamarin-ios-c #
SoftSan

25

За допомогою авторозкладки (iOS6 +) ви можете уникнути налаштування contentSize. Натомість встановіть такі обмеження:

  1. Закріпіть верхню частину прокручуваного перегляду у верхній частині її верхньої дочірньої частини.
  2. І прикріпіть нижню частину до самої нижньої дочірньої дитини.

1
Дякую - налаштування contentSizeне працюють з Xcode 5 та iOS 7
colincameron

18

Ви можете зробити це, використовуючи лише Interface Builder, перейти до інспектора посвідчень (третя вкладка інспектора) і додати новий атрибут User Runtime, визначений користувачем

  • Ключовий шлях: contentSize
  • Тип: Розмір
  • Значення: {ширина, висота}

14

Тепер є спосіб зробити UIScrollViewсувій, не виходячи з Storyboard :

  1. Виберіть UIScrollViewу розкадруванні, перейдіть до інспектора розміру та змініть значення внизу (або будь-яке інше значення, яке потрібно змінити) у розділі Вставки вмісту на висоту області вмісту.
  2. Тепер перейдіть до інспектора посвідчень і створіть новий визначений користувачем атрибут виконання (натиснувши кнопку +) та назвіть його contentSize. Не має значення, який тип або значення ви вводите (ви можете навіть залишити значення за замовчуванням).

Це зробить UIScrollViewроботу належним чином, хоча я не знаю, для чого потрібен другий крок (я це випадково з’ясував). :(


Змінити нижнє значення на що?
zakdances

Змініть його на висоту області вмісту. Здається, це працює і замінює значення, яке ви надаєте для визначеного користувачем атрибута "contentSize".
Рейд Елліс,

Так, Рід, ти маєш рацію: ти повинен змінити нижнє значення на висоту області вмісту. Я відредагував своє оригінальне повідомлення, щоб відобразити це. Дякую!
RoberRM

4

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

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

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

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

під час виконання, у - (void) viewDidLoad

scrollView.contentSize = scrollView.frame.size;
scrollView.frame = placeholder.frame;
[placeholder.superview addSubView:scrollView];
[placeholder removeFromSuperview];

або (якщо ви не використовували заповнювач):

CGRect f = self.view.frame;
scrollView.contentSize = f.size;
f.origin.x = 0;
f.origin.y = 0;
scrollView.frame = f;
[self.view addSubView:scrollView];

нарешті, якщо ви «загубите» свій вид прокрутки у конструкторі інтерфейсу (його можна закрити, щоб він зник з сітки дизайну), не панікуйте. просто натисніть на нього в списку об’єктів ліворуч від сітки дизайну.


1
Дякую - це спрацювало добре. Також потрібно оголосити IBOutlets у YourViewController.h для заповнювача та подання прокрутки та підключити їх у Interface Builder. І нарешті, dot.notation не був оцінений xCode для 3-го рядка, тому використовувався звичайний синтаксис надсилання повідомлень - тоді все працювало чудово!
jiy

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

Це метод, яким я насправді користуюся. Мені навіть не потрібно змінювати розмір цієї програми взагалі. Я думаю, що це так, як це передбачається зробити. Це єдина вірна відповідь.
user4951

Намалювавши його назовні, я просто переміщу його на супервигляд. Тада.
user4951

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

4

У Xcode 4.5 за допомогою авторозкладки у моєму інспекторі розмірів немає розділу Вставки вмісту. Тож мені довелося додати його під визначені користувачем атрибути виконання, і тоді він працював нормально.

Те, що ви додаєте в "Визначені користувачем атрибути виконання", це keyPath == contentInset, який має тип "Rect" (UIEdgeInsets, який має той самий вхід, що і Rect) і визначається як {top, left}, {bottom, right}. ContentSize визначає лише область вікна прокрутки. contentInset визначає прокручувану область.

Сподіваюся, це допоможе комусь у тій самій ситуації.


Для UITextView використовуйте "textContainerInset" keyPath
Діма Деплов

4

Багато наведених вище відповідей оманливі або застарілі. Станом на 2017 г. (можливо , набагато раніше) інтерфейс будівельник робить підтримку scrollviews з вмістом автоматично розміру. Фокус у тому, що XCode надає особливе, нестандартне значення обмеженням між прокручуваним переглядом та вмістом усередині нього. Ці "внутрішні" обмеження насправді не вплинуть на розмір вмісту, як ви могли б очікувати в іншому випадку.

Це означає, що ви можете, наприклад, закріпити свій прокручувальний перегляд внизу основного перегляду з нульовим полем, а також закріпити вміст прокручуваного перегляду в нижній частині прокручуваного перегляду з нульовим полем, але вміст цим фактично не розтягнеться. Натомість вміст отримає самостійно визначений розмір (докладніше нижче), і це також буде розмір області, що прокручується, у режимі прокрутки.

Подумайте про це так - Існує асиметрія обмежень прив'язки до перегляду прокрутки: Обмеження від перегляду прокрутки до "зовнішнього" (батьківського) світу визначають розмір та положення прокручування, як зазвичай. Але обмеження "всередині" перегляду прокрутки насправді встановлюють розмір і положення області прокрутки перегляду прокрутки, прив'язуючи її до вмісту.

Це абсолютно неочевидно, тому що коли ви йдете встановлювати обмеження, XCode завжди буде пропонувати поточний інтервал, і вам ніколи не спаде на думку навмисно змінити обмеження, спрямовані всередину і зовні, таким чином, щоб конфліктувати. Але ви можете, і вони мають значення, описане вище: один контролює макет прокрутки, а другий - розмір області прокручуваного вмісту.

Я випадково натрапив на це, а потім, побачивши, як це спрацювало, привело мене до цієї статті, яка повністю це пояснює і цитує для цього джерело документації Apple:

https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/

Остання важлива інформація про самостійно визначений розмір вмісту: Ви можете відчути, що знаходитесь тут у catch-22, оскільки зазвичай розмір вмісту становить, наприклад, ширина батьківського подання, але в цьому випадку батьківським є перегляд прокрутки та як описано вище - обмеження не вплине на розмір вашого вмісту. Відповідь тут полягає в тому, щоб пам’ятати, що ви можете обмежувати елементи елементами, які не знаходяться безпосередньо в сусідній з вашою ієрархією подання: наприклад, Ви можете встановити ширину свого подання вмісту на ширину основного подання, замість того, щоб марно намагатися змусити прокручувати перегляд. для вас.


2

Якщо натиснути піктограму Властивості будь-якого контролера перегляду у програмі Interface Builder, ви можете встановити для нього розмір "Вільна форма" в "Імітовані метрики" та змінити розмір основного подання на бажаний розмір вмісту.

Таким чином ви можете створити вміст ScrollView так, ніби це один великий перегляд. Оскільки це лише змодельована метрика, ваш View Controller буде змінено до меж вікна, коли він буде завантажений.


2

Налаштування UIScrollView за допомогою Interface Builder не є інтуїтивно зрозумілим. Ось мій контрольний список для його налаштування:

  1. Виберіть файл XIB UIViewController. У "Інспекторі посвідчень" розробника інтерфейсів змініть UIView на тип класу UIScrollView

  2. У розділі "Інспектор файлів" зніміть прапорець біля пункту Автоматичне розміщення

  3. У розділі "Інспектор атрибутів" змініть розмір на Freeform. Потім ви можете розтягнути режим прокрутки вручну, або ви можете вказати власну ширину та висоту в розділі "Інспектор розмірів".

  4. У "Інспекторі посвідчень" додайте новий визначений користувачем атрибут виконання під назвою "contentSize" типу "Size" і змініть його на значення, наприклад {320, 1000}. Ви більше не можете встановити це програмно, і тому вам потрібен цей крок, щоб режим прокрутки знав, що вміст вигляду прокрутки більший за вікно.


2

Просто видаліть авторозкладку у своєму перегляді прокрутки. тоді код такий же простий:

scrollviewName.contentSize = CGSizeMake(0, 650);

просто створіть властивість iboulet у файлі .h, а потім синтезуйте у файлі .m. Переконайтеся, що прокрутка ввімкнена.


1

Так, st3fan має рацію, має бути встановлено властивість contentSize UIScrollView. Але для цього не слід вимикати авторозкладку. Ви можете легко налаштувати ContentSize розміру UIScrollView за допомогою авторозкладки лише в IB, без будь-якого коду.

Важливо розуміти, що при використанні авторозкладки contentSize розміру UIScrollView не встановлюється безпосередньо, він обчислюється на основі обмежень усіх підпоглядів UIScrollView. І все, що вам потрібно, - це надати належні обмеження для підпрограми для обох напрямків.

Наприклад, якщо у вас є лише один підзапис, ви можете встановити його висоту та простір зверху та знизу до перегляду (тобто scrollView у нашому випадку) contentSize.height обчислюється як сума

Vertical Space (aSubview.top to Superview.top) + aSubview.height + Vertical Space (aSubview.top to Superview.top)

contentSize.width обчислюється аналогічно з горизонтальних обмежень.

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

Якщо є багато підвидів , то це може бути «ланцюг» обмеження: зверху верхній підвид, висоту і простір між підвидами і нижнім підвидом вниз , як в Danyal Айтекін відповіді.

Але на практиці в більшості випадків зручніше просто додати порожній вигляд необхідного розміру та встановити пробіли зверху, ліворуч, знизу, праворуч від scrollView до 0. Ви можете використовувати цей вигляд як "Перегляд вмісту", тобто розмістити всі інші підпрограми на ньому, або якщо у вас вже є багато підпроглядів, і ви не хочете їх переміщати та налаштувати макет знову, ви можете додати цей допоміжний вигляд до існуючих підпрограм і зробити його прихованим.

Щоб зробити scrollView прокручуваним обчислюваним вмістом, розмір повинен бути більшим за розмір scrollView.


1

Ви можете мати UIScrollView в StoryBoard з авторозкладками. В основному, що вам потрібно, це:

  1. Додайте UIScrollView
  2. Додайте до нього всі обмеження (наприклад, вставки з верхнього, лівого, правого, нижнього країв)
  3. Додайте UIView "контейнера" ​​до UIScrollView
  4. Якщо вам потрібна лише однонаправлена ​​прокрутка (скажімо, вертикальна): явно встановіть висоту (наприклад, 600) та ширину посилання на ширину UIScrollView.
  5. Якщо ви хочете двонаправлену прокрутку, просто встановіть як ширину, так і висоту.

налаштування розкадровки



0

Я знаходжу більш зручний спосіб.

1: Масштабуйте розмір подання прокрутки, щоб містити все користувацький інтерфейс всередині нього.

2: Додайте розділ перегляду прокрутки.

3: У viewDidLoad збережіть фрейм. Розмір вікна прокрутки.
(наприклад, _scrollSize = _scrollView.frame.size;)

4: У viewWillAppear встановіть contentSize за розміром CGS, який ви зберегли раніше.
(наприклад, _scrollView.contentSize = _scrollSize;)

5: Готово ~


0
  1. Додайте UIViewController
  2. В UIViewController 'Інспектор атрибутів -> Імітовані метрики' встановіть розмір Freeform
  3. У UIViewController 'Inspector Size -> View Controller' встановіть висоту 800
  4. Додайте UIScrollView в UIViewController
  5. Додайте всі обмеження до UIScrollView (зверху, ліворуч, праворуч, знизу) та додайте вирівнювання X = центр
  6. Додайте UIView в UIScrollView
  7. Додайте всі обмеження до UIView (зверху, ліворуч, праворуч, знизу) та додайте вирівнювання X = центр. Так, як і для UIScrollView в №3, але для UIView
  8. Додайте обмеження висоти до UIView. Наприклад 780
  9. Біжи

Дошка розкадрувань


0

Створіть новий проект Xcode

Перейдіть до файлу Main.storyboard

Виберіть ScrollView з бібліотеки об’єктів.

Встановити кадр для ScrollView.

Додайте інший вигляд, щоб прокрутити перегляд і зберегти кадр таким же, як у ScrollView.

Тепер для динамічного встановлення його висоти та ширини ви можете налаштувати UIScrollView за допомогою автоматичного макетування в XIB

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