Як я можу використовувати Autolayout для встановлення обмежень для мого перегляду UIScroll?


176

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

Тож ось моє прохання про допомогу.

Джерело:

UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton

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

-

Я спробував змішаний підхід, як-от так:

UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton

... та встановлення обмежень по ширині та висоті для contentviewтаtranslatesAutoresizingMaskIntoConstraints параметрів відповідно до TechNote від Apple. Кнопки та перегляд прокрутки налаштовуються за допомогою обмежень. Це отримує прокрутку прокрутки (так), але на жаль, вона прокручується занадто далеко! Наскільки я можу сказати, ширина прокрутки якимось чином подвоюється від того, що я встановив contentview на ??? !!! ???

Я також спробував чистий підхід до автоматичного розкладу, як contentviewі без , так і без. Усі перегляди є translatesAutoresizingMaskIntoConstraints=NO, крім self.view. Кнопки мають обмежені обмеження по ширині / висоті та закріплені на всіх чотирьох краях прокрутки. Нічого не прокручується.

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

ОНОВЛЕННЕ Знімок екрана з рішенням - обмеження для кнопки Z:

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

EDIT @ Jamie Forrest Тож рішення виявляється помилковим обмеженням на останній кнопці. Замість 6441 значення, яке я встановив, було мінус -6441. Найскладніша річ у тому, що при встановленні значення в раскадровці на панелі інструментів Pin є два варіанти:

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

Поточне значення полотна негативне (призводить до відсутності прокрутки), а параметр нижче - позитивний (активація прокрутки). Це означає, що я не дурний, але, принаймні, напівсліп. Хоча, на мій захист, чи не є дещо тривожним те, що XCode не показує помилку для "неправильного" налаштування?

Відредаговане ЗНОВУ Зараз це смішно ... зміна значення косого від -6441 (без прокрутки) в 6441 включений свиті. Але мій старий друг, "занадто багато вмісту" повернувся, що призвело до того, що розмір вмісту вдвічі більший, ніж він повинен бути! Рішенням для отримання правильної прокрутки вмісту було встановити обмеження для ЗКР за заднім числом! Це не очевидно, коли ви працюєте у Storyboard, але дивлячись на код @Infinity James, це має бути.


Де ви обчислюєте / встановлюєте розмір вмісту для перегляду прокрутки? Посилаючись на вашу першу спробу використання contentView, ви сказали, що вона прокручується занадто далеко.
Тім

2
Наскільки я знаю, ви не можете встановити contentSizeз UIScrollViewвикористання тільки автоматичної компонування. І саме contentSizeте визначає, скільки можна прокручувати. Тому вам доведеться встановити це вручну десь з часом. Для решти, ви можете використовувати обмеження для компонування, щоб встановити кадри перегляду відносно один одного.
Гійом

@Jeff, розмір вмісту виправлений, він ніколи не змінюється. Я встановлюю розмір вмісту в дошці повідомлень, вводячи правильну висоту та ширину для contentiview вручну, і встановлюю висоту та ширину з обмеженнями в дошці повідомлень.
user1459524

Роздрукуйте свій розмір вмісту під час виконання, подивіться, чи відповідає він введеним вами значенням. ContentSize визначає кількість прокрутки, тому проблема з вашою першою спробою пов'язана з contentSize.
Тім

@Guillaume, значить, підхід "чистого авторозміщення" не є таким чистим? Але ЯК я встановити contentSize вручну? Як я вже згадував вище, я встановлюю висоту / ширину перегляду вмісту за фіксованими значеннями (у розкадровці). Але вона прокручується занадто далеко (2x).
користувач1459524

Відповіді:


68

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

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

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

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

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


2
ДЯКУЙТЕ за зразок проекту! Це працює, і, переглядаючи його, спершу я не міг знайти різниці в моєму проекті! Я скопіював погляди у свій проект, підозрюючи про інші налаштування, ніж обмеження, але він продовжував працювати. Це призвело до того, що я помітив, що обмеження для останньої кнопки в моєму проекті має негативне значення - перед цим, тоді як ваше має позитивне значення! Зміна - на позитив увімкнула прокрутку! Коли я відкриваю панель інструментів «Пін», є два варіанти: Використовувати значення Поточне полотно, яке є негативним, і Перегляд прокрутки (використовувати поточне значення), яке є позитивним ...?!
користувач1459524

Ага, так. Від'ємне значення фактично зробить розмір contentSize виду прокрутки меншим, щоб відповідати тому, що край край повинен закінчуватися до кінця кнопки. Радий, що зразок проекту допоміг!
Джеймі Форест

Це багато зробило. Перевірте мою оновлену відповідь. Кінцеве значення фактично повинно бути 0 (нуль), здається.
користувач1459524

6
Це сумно, що ми маємо ділитися скріншотами замість коду. Це лише тому, що Apple заохочує розробників використовувати builder замість надання кращої версії api.
Владимир Славік

4
Зовсім неінтуїтивні. Розробникам доводиться витрачати години і години, щоб зрозуміти, що відбувається на увазі творців XCode.
Джош

49

LOL Ласкаво просимо в клуб дурості. Я один із засновників. : D

Для прокрутки VERTICAL : єдиний спосіб, коли я міг би змусити його працювати (iOS 8, Xcode 6 і чистий авторозклад), було додавання наступних обмежень до мого перегляду прокрутки (усі пов'язані із супереглядом):

  • Рівні ширини
  • Рівні висоти
  • Центр Y Вирівнювання
  • Вирівнювання по центру X

Моя структура:

  UIView
   - ScrollView
    - Subview
    - Subview
    - Subview
    - Subview
    - ...

Це кінцевий результат:

Демо

Це налаштування:

Налаштування Повноекранний

І ось проект .

Сподіваємось, це допоможе врятувати когось із ПЕРЕГЛЯДУВАННЯ ДО СЛОВА О 5 ранку. : D


Дякую за допомогу! Як у вас з'явився підвид типу "підвід" ?? Я дивлюся на ваш проект у Xcode 6.2, і він називає ці маленькі ректанти "Subview" з єдиним обмеженням у тому, що він високий 63 пікселів.
Ендрю К

1
Привітання! Цей "Підзор" насправді є UIVIew. Це лише ім'я ... Ви можете там набрати що завгодно. Перегляньте це зображення: cl.ly/image/291f1K2N0V3p У темі обмеження субперегляди мають більше, ніж просто обмеження по висоті. Перегляньте весь список обмежень на ці погляди тут: cl.ly/image/3l061i123j2i
зворотна коса

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

Крім того, як ви зробили ваш нагляд настільки довшим, ніж довжина за замовчуванням? Я намагаюся додати кнопки, які з'являтимуться "внизу сторінки" (або поза екраном), але, очевидно, я не можу додати їх до цього огляду, якщо я не можу перетягнути їх на перегляд, оскільки він недостатньо великий.
Ендрю К

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

32

Простий самостійний приклад

Судячи з великої кількості голосів за питання та малої кількості голосів відповідей, люди не знаходять тут зрозумілого та швидкого рішення. Дозвольте спробувати додати. Цей проект є автономним прикладом, зробленим повністю у програмі Interface Builder. Ви повинні мати можливість пропрацювати це протягом 10 хвилин або менше. Потім ви можете застосувати вивчені поняття до власного проекту.

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

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

Основні поняття

  • UIScrollViewСлід використовувати тільки один підвид. Це "UIView", який служить переглядом вмісту, щоб зберігати все, що ви хочете прокручувати.
  • Зробіть подання вмісту, а батьківський вигляд прокрутки має рівні висоти для горизонтальної прокрутки. (Рівні ширини для вертикальної прокрутки)
  • Переконайтесь, що весь вміст, який можна прокручувати, має задану ширину та закріплений з усіх боків.

Почніть новий проект

Це може бути лише програма для перегляду в одному режимі.

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

У цьому прикладі ми зробимо подання горизонтальної прокрутки. Виберіть контролер перегляду, а потім оберіть вільну форму в інспекторі розмірів. Зробіть ширину 1,000і висоту 300. Це просто дає нам місце на аркуші розкадрівки, щоб додати вміст, який буде прокручуватися.

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

Додати перегляд прокрутки

Додайте a UIScrollViewі закріпіть усі чотири сторони до кореневого виду контролера перегляду.

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

Додати перегляд вмісту

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

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

Рівні висоти

Тепер у «Нарисі документа» Commandклацніть перегляд вмісту та батьківський вигляд подання прокрутки , щоб вибрати їх обидва. Потім встановіть висоти рівними ( Controlперетягніть з перегляду вмісту до перегляду прокрутки). Це також є ключовим. Оскільки ми прокручуємо горизонтально, подання вмісту подання прокрутки не буде знати, наскільки високим він повинен бути, якщо ми не встановимо його таким чином.

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

Примітка:

  • Якщо ми робимо прокручування вмісту вертикально, то встановимо б ширину подання вмісту рівну батьківській ширині подання прокрутки.

Додайте вміст

Додайте три UIViewс і обмежте їх. Я використовував 8-кратну маржу для всього.

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

Обмеження:

  • Зелений вигляд: закріпіть верхній, лівий і нижній краї. Зробіть ширину 400.
  • Червоний вигляд: закріпіть верхній, лівий і нижній краї. Зробіть ширину 300.
  • Фіолетовий вигляд: приклейте всі чотири ребра. Зробіть ширину незалежно від залишку місця (268 у цьому випадку).

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

Готово

Це все. Ви можете запустити свій проект зараз. Він повинен вести себе як прокручуване зображення у верхній частині цієї відповіді.

Для вертикальної прокрутки просто поміняйте в цьому прикладі всі напрямки ширини та висоти (перевірені та працюючі).

Подальше навчання


9

ContentSize неявно встановлюється, застосовуючи обмеження всередині UIScrollView.

Наприклад, чи є у вас UIScrollView всередині UIView, це буде виглядати приблизно так (як я впевнений, що вам відомо):

    UIView *containerView               = [[UIView alloc] init];
    UIScrollView *scrollView            = [[UIScrollView alloc] init];
    [containerView addSubview:scrollView];
    containerView.translatesAutoresizingMaskIntoConstraints = NO;
    scrollView.translatesAutoresizingMaskIntoConstraints    = NO;
    NSDictionary *viewsDictionary       = NSDictionaryOfVariableBindings(containerView, scrollView);

    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"
                                                                          options:kNilOptions
                                                                          metrics:nil
                                                                            views:viewsDictionary]];
    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|"
                                                                          options:kNilOptions
                                                                          metrics:nil

Це дозволить scrollView заповнити розмір containerView (тому контейнерView повинен мати певний розмір).

Потім можна відрегулювати contentSize UIScrollView, неявно встановивши його, щоб він був достатньо великим, щоб утримувати такі кнопки:

    UIButton *buttonA                   = [[UIButton alloc] init];
    UIButton *buttonB                   = [[UIButton alloc] init];
    UIButton *buttonC                   = [[UIButton alloc] init];
    [scrollView addSubview:buttonA];
    [scrollView addSubview:buttonB];
    [scrollView addSubview:buttonC];
    buttonA.translatesAutoresizingMaskIntoConstraints       = NO;
    buttonB.translatesAutoresizingMaskIntoConstraints       = NO;
    buttonC.translatesAutoresizingMaskIntoConstraints       = NO;

    viewsDictionary                     = NSDictionaryOfVariableBindings(scrollView, buttonA, buttonB, buttonC);

    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonA]-|"
                                                                       options:kNilOptions
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonA]-[buttonB]-[buttonC]-|"
                                                                       options:NSLayoutFormatAlignAllBaseline
                                                                       metrics:nil
                                                                         views:viewsDictionary]];

Отже, я встановлюю обмеження між scrollView і кнопками, а не контейнерView і кнопки? Я думаю, це лише в тій різниці, якою я займаюся спортом вашого коду і тим, що я зараз роблю через раскадровку.
користувач1459524

Лише після другого читання я зрозумів, що ви встановлюєте перегляд CONTAINER, а не CONTENT. Виходячи з вашого коду, я відтворив все саме в раскадровці, і це не прокрутка. Я відредагую своє запитання за допомогою деяких скріншотів.
user1459524

1
Тож виявляється, що моя спроба відтворити код у раскадровці не була на 100% правильною. Кінцеве значення для останньої кнопки має бути рівно нульовим, дзеркальне відображення H: | - [buttonA] - [buttonB] - [buttonC] - | що не дуже очевидно при роботі в раскадровці (або, принаймні, не для мене), але тепер після цього факт здається тривіальним. Я люблю автоклауз, але ці дрібниці отримують тебе ...
user1459524

Те, що згадував @ user1459524, було проблемою для мене. Мій вигляд знизу був кнопкою, а нижнє обмеження - ІБ. Я встановив це на 0, і він оновився в IB, щоб він був нижній простір, щоб: переглянути. Це буде працювати, також здається, поки ви на позитивній стороні це працює. Схоже, це може бути помилка з ІБ. Сподіваюся, що допоможе хтось інший. Я також видалив усі перегляди та перемотав, що допомагає при спробі викласти ці дані, які я знаходжу, і це зазвичай не займає багато часу.
Майкл

8

Існує так багато питань щодо використання функції AutoLayout з UIScrollView, ключовим моментом, який ми ігноруємо, є те, що внутрішні погляди UIScrollView обмежують перегляд вмісту, а не сам UIScrollView. Зверніться до Технічної примітки TN2154 , яку ви можете знайти:

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

На наступному малюнку зображено, що: введіть тут опис зображення

Ви можете виявити, що кінцевий простір становить 500 балів, якщо обмеження зроблено для UIScrollView, подання буде пропущено, і його слід оновити кадр. Однак жодних попереджень і помилок немає. Тому що всі обмеження суперечать перегляду вмісту.

UIScrollView обчислить розмір перегляду вмісту відповідно до обмежень внутрішніх подань. (Наприклад, розмір вмісту: ширина = 100 (провідний простір) + 200 (ширина подання) + 500 (пробіл), висота = 131 (пробіл) + 200 (висота) + 269 (нижній інтервал)

Як додати обмеження для переглядів у UIScrollView:

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

І все це робиться.

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

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

прикладений приклад коду


5

Наступне рішення для мене працювало для scrollView з автоматичним розкладом і без contentSize :

  1. Перетягніть n drop scrollView, щоб переглянутиController, і застосуйте всі обмеження, щоб покрити потрібний простір.
  2. Перетягніть UIView усередину scrollView і змусьте охоплювати весь простір scrollView і застосувати обмеження для верхнього, лівого, правого і нижнього простору від scrollView.
  3. Встановіть висоту (і ширину, якщо потрібна горизонтальна прокрутка) внутрішнього виду відповідно до потреби прокрутки. Ця частина також може бути виконана з коду, якщо потрібно.
  4. Критичний . Після того як ви встановите висоту в великій величині в точці (3), поверніться до точки (2) і обов'язково встановіть значення верхнього, лівого, правого, нижнього повернення до нуля, оскільки Xcode, можливо, змінив їх для вас, коли ви примушуєте змінив висоту в (3).

І ви закінчили. Тепер ви можете додати будь-яку кількість елементів керування до цього виду та застосувати обмеження, що стосуються один одного (які, здається, не працюють без цього подання). Якщо ви не хочете використовувати цей вид, тоді вам доведеться застосувати обмеження для кожного елемента управління, пов'язаного з scrollView (не пов'язаного один з одним).


Переважна порада ..............

Критичний . Скажімо, для ясності UIScrollView 1000 широкий і 100 високий. (Насправді ці значення зазвичай будуть динамічними, звичайно, залежно від ширини пристрою і т. Д. Але поки що скажімо лише 1000 шириною і 100 висотою.) Скажімо, ви робите горизонтальну прокрутку. Тому поставте UIView всередині UIScrollView. . Зробіть їх усі нульовими, навіть якщо це здається неправильним. Встановіть висоту вмісту UIView на 100 і забудьте про це. Тепер: ви хочете прокручувати горизонтально, тому встановіть ширину перегляду вмісту, як скажімо, 1225.

Зауважте, що ширина подання вмісту тепер на 225 більше, ніж ширина батьківського подання прокрутки. Це все в порядку: насправді, ВИ ТАКОЙ СПОСІБНО це зробити. Зауважте, що

... ви НЕ встановлюєте кінцеву ширину на мінус 225 ...

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

Ви повинні встановити провідні та кінцеві номери на ZERO , ніколи не від'ємних (навіть якщо ширина "більша")

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

Зауважте, що, нахабно, часто Xcode (станом на 7.3.1 все одно),

"корисно" встановить ці значення для вас на від'ємні числа!

тому що він намагається автоматично підрахувати їх для вас. Якщо так, то вона мовчки зламається. Встановіть усі чотири значення в нуль у першу чергу. І встановити ширину перегляду вмісту набагато ширше, ніж "1000" у прикладі.


Відредаговано: я в більшості своїй використовував UITableView замість UIScrollView. Як мені здається tableView набагато більш гнучким та динамічним.


Тут насправді найкраща відповідь. Дякую!
Fattie

4

Я припускаю, що у вас виникають проблеми з contentSize. Перегляньте цю публікацію в блозі про те, як впоратися з contentSizeвикористанням "чистого" підходу до автоматичного розкладу. Суть її в тому, що ваші обмеження неявно визначають розмір вмісту. Ви НІКОЛИ не встановлюєте це явно під час використання функції AutoLayout. Я додав приклад проекту в кінці публікації блогу, щоб продемонструвати, як це працює


3

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

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

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

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

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


3

Якщо у вас запитання "Як я помістити купу UITextFields у вертикально прокручувану UIScrollView таким чином, щоб вони рухалися з клавіатури, коли мають фокус", найкраща відповідь:

Не варто.

Використовуйте натомість UITableViewController зі статичними осередками.

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


3

Ви повинні організувати свій макет таким, який
ViewControllerViewмістить ScrollView, ScrollViewмістить ContainerView, ContainerViewмістить 2Labels
введіть тут опис зображення

Потім виконайте 3 кроки, щоб зробити свою ScrollViewпрокрутку

  1. Установочний ScrollViewштифт (верхній / правий / нижній / лівий) доViewControllerView
    • Налаштування ContainerViewштифт (верхній / правий / нижній / лівий) доScrollView
    • Встановити Horizontally in Container( не встановлювати Vertically in Container)
    • Label1штифт ( вгору / вправо / вліво) доContainerView
    • Label1штифт (вправо / вліво / внизу ) до ContainerViewі вгору доLabel1

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

ТУТ - демонстраційний проект

Сподіваюся, що це допоможе


1

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

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

1

Через деякий час займаючись цим питанням, я нарешті знайшов рішення. Я працюю з розкадровками універсальних класів (600x600). Я створив UIView (contentView) розміром scrollView і створив обмеження для Top, Bottom, Leading та Trailing to scrollView. Потім я вручну обрізав розмір contentView до 600x600. Розпорядження перестало намагатися змінити розмір усе, і я міг працювати, але вигляд виглядав жахливо на реальному пристрої чи тренажері. Я зробив 2 обмежувальні розетки цього розміру.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewWidthConstraint; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewHeightConstraint;

Потім у viewDidLoad

CGSize viewSize = self.view.frame.size;
self.contentViewWidthConstraint.constant = viewSize.width;
self.contentViewHeightConstraint.constant = viewSize.height;

Чудово працює.


1

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

Я витрачав дні, намагаючись зробити це лише з Autolayout, і наблизився, але ніколи не закрився. Отже, врешті-решт, мені довелося додати 3 рядки коду на екран також у viewDidLoad.

Дивіться рішення нижче:

  1. Створіть перегляд прокрутки і заповніть його будь-якими об'єктами, які ви хочете
  2. Увімкніть автоматичне розташування
  3. Потім центрируйте ScrollView вертикально і горизонтально Центр ScrollView
  4. Виберіть Перегляд, а потім "Додати відсутні обмеження" - це щось робить свою справу
  5. Результатом є те, що створюється багато обмежень. Для перегляду створено 2 нових: "Прокрутка прокрутки Horiz до перегляду" та "Перегляд прокрутки пробілу Верт для перегляду" або навпаки.
  6. Видаліть перегляд прокрутки "Простір Горіза для перегляду", щоб у вас залишилось 3 обмеження на Перегляд. 2 для введення перегляду прокрутки у вигляд і один для встановлення вертикального пробілу між оглядом прокрутки та поданням
  7. Тепер прив’яжіть обмеження Vert до свого коду, натиснувши та Ctrl, перетягнувши його до заголовкового файлу та створивши NSLayoutConstraint IBOutlet (я назвав mine constraintVertVtoSV)
  8. Тепер перейдіть до файлу .m і додайте ці рядки коду до viewDidLoad (пограйте з сумою накладки, щоб отримати правильне центрування вершин)

    if (IPAD)

    {self.constraintVertVtoSV.constant = 150.0; }

  9. тепер це має працювати на всіх пристроях і бути належним чином по центру та все ще належним чином прокручуватися.


1

Якщо ви, як я, ви просто використовуєте статичний вміст без обмежень всередині субпрев'ю, як ви можете зробити так:

override func viewDidLayoutSubviews() {
    scrollView.contentSize = CGSizeMake(320, 800)
}

1

Подібна проблема у мене сьогодні з iOS 8.4, Xcode 6.4

Існує подання, що містить подання прокрутки, що містить contentView (UIView), що містить підгляди.

Все скрізь - це автоматичне розташування. Краї прокрутки прикріплюються до батьківських країв перегляду з обмеженнями. Краї перегляду вмісту прикріплюються до країв перегляду прокрутки з обмеженнями.

Спочатку перегляд вмісту відмовився від розміру як повна ширина подання прокрутки. Мені довелося додати додаткове обмеження для подання вмісту, щоб його ширина відповідала виду прокрутки батьків. Або я можу встановити обмеження contentView.centerX == scrollView.centerX. Будь-яка з них, окрім закріплення країв, раптом зробила перегляд вмісту належним чином.

// Either one of these additional constraints are required to get autolayout to correctly layout the contentView. Otherwise contentView size is its minimum required size
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .CenterX, relatedBy: .Equal, toItem: scrollView, attribute: .CenterX, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0.0))

Закріплення країв перегляду вмісту до подання прокрутки за допомогою візуальних обмежень форми,

let cvConstraints = ["H:|[contentView]|", "V:|[contentView]|"]

Я використовую рутину, щоб перебирати масив і додавати їх до scrollView.


1

Я зіткнувся з подібною проблемою. Я встановлював все обмежене і завжди цікавився, чому він все-таки змінює розмір деяких підвидів. Моє рішення полягало в тому, щоб встановити clipsToBounds на YES.


1

У стрижа ви можете використовувати цей робочий розчин.

Протипоказання

ScrollView: Провідна, Задні, Вгорі, Нижня = Супервізія

ContentView: Провідна, Задні, Вгорі, Знизу = ScrollView. Висота фіксована / відносно змісту.

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

extension UIView {

    func setupContentViewForViewWithScroll(contentView vwContent : UIView) {
        //Set constraint for scrollview content
        let constraint = NSLayoutConstraint(item: vwContent, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.bounds.size.width)
        vwContent.addConstraint(constraint)
        self.layoutSubviews()
    }

}

А в Контролері подання viewDidLayoutSubviewsя просто викликаю цей метод:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.view.setupContentViewForViewWithScroll(contentView: vwContent)
}

0

Я знаю, що це непрофесійне рішення, а не те, що Apple пропонує в документі, але воно працювало для мене двічі, з різним вмістом і його можна налаштувати дуже швидко: у контролер подання розкадровки вставити UIView. У UIView вставити таблицю View, Dynamic, 0 Prototype комірки, Style Plain або Grouped. У Перегляд таблиці вставити Перегляд прокрутки, у Перегляд прокрутки вставити вміст. Це все, налаштувань у користувальницькому контролері перегляду немає.

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