Невизначеність розміру вмісту, що прокручується, UIScrollView


510

Колеги-розробники, у мене проблеми з AutoLayout в Interface Builder (Xcode 5 / iOS 7). Це дуже просто і важливо, тому я думаю, кожен повинен знати, як це правильно працює. Якщо це помилка в Xcode, вона є критичною!

Отже, кожного разу, коли у мене є така ієрархія перегляду, я стикаюся з проблемою:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

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

Проблема починається, коли я додаю обмежувальне обмеження до UILabel:

Напр., Відстань від місця до: огляд рівний: 25

Зараз виникають два попередження - і я не розумію, чому:

A) Невизначеність розміру вмісту, що прокручується (Перегляд прокрутки має неоднозначну висоту / ширину вмісту, що прокручується)

B) Неправильне розміщення переглядів (очікувана мітка: x = -67 Фактична: x = 207

Я зробив цей мінімальний приклад у нещодавно новому проекті, який ви можете завантажити, і я додав скріншот. Як бачимо, Interface Builder очікує, що Мітка буде за межами межі UIScrollView (помаранчевий пунктирний прямокутник). Оновлення кадру мітки за допомогою інструмента вирішення питань переміщує її прямо туди.

Зверніть увагу: Якщо ви заміните UIScrollView на UIView, поведінка є такою, як очікувалося (рамка Мітки правильна і відповідно до обмеження). Тому, здається, що з UIScrollView виникає проблема, або я пропускаю щось важливе.

Коли я запускаю додаток, не оновлюючи рамку мітки, як запропонував IB, вона розміщується просто добре там, де вона повинна бути, і UIScrollView прокручується. Якщо я НЕ оновлюю кадр, мітка не видно, і UIScrollView не прокручується.

Допоможи мені Оби-Ван Кенобі! Чому неоднозначна компоновка? Чому неправильний вигляд?

Ви можете завантажити зразковий проект тут і спробувати, чи можете ви зрозуміти, що відбувається: https://github.com/Wirsing84/AutoLayoutProblem

Ілюстрація проблеми в Interface Builder


8
Спробуйте помістити UILabel у перегляд вмісту, а потім встановіть кінцевий край мітки до перегляду вмісту (звичайний UIView). Це відео може вам дуже допомогти: youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be
erdekhayser

1
Відмінне відео, але воно не виправило попереджень для мене. :(
Містер Роджерс

Дуже дякую за відео - було (досить дивно) досить багато чого я дізнався з нього! Однак, коли я поєдную знання про відео з stackoverflow.com/questions/18953617/…, я можу виправити попередження. Залишається питання: як зробити розмір scrollView contentView лише настільки великим, наскільки це потрібно?
Wirsing

Подивіться це відео. Він показує, як використовувати UIScrollLayout та авторозкладку з XCode 5 / iOS 7.
jaxvy

Моя пропозиція не використовувати UIScrollViewбезпосередньо. Замість цього використовуйте UICollectionViewабо UITableViewнаскільки це можливо, в основному можлива кожна річ з цими елементами, і це також дає простоту, читабельність та повторність використання !!!
SPatel

Відповіді:


1093

Тому я просто розібрався таким чином:

  1. Усередині UIScrollView додатиUIView (ми можемо назвати це contentView);

  2. При цьому contentView, безліч зверху, знизу, зліва і правого полів до 0 (звичайно з scrollViewяких є superView); Також встановіть вирівнювання центру по горизонталі та вертикалі ;

Готово .

Тепер ви можете додати всі ваші думки в тому , що contentView, і contentSizeз scrollViewавтоматично буде змінений в відповідно до contentView.

Оновлення:

Деякий особливий випадок висвітлюється цим відео, яке опублікував @Sergio у коментарях нижче.


33
Майже ідеально, за винятком того, що перегляд прокрутки вже не може вгадати довжину вашого вмісту і відповідно змінити розмір його вмісту для розміщення об'єктів всередині. У мене є viewview у contentView, висота якого змінюється (через обмеження) і viewview не дозволяє мені прокручувати.
CyberMew

28
Можливо, це відео допоможе подолати всі інші проблеми.
Серхіо

46
це не змушує прокрутити тхо.
Доріан

2
@MatteoGobbi Це було все! Це зробило трюк! Боровся з подібними проблемами scrollView божевілля в autoLayout протягом 2 днів .... Дякую, чувак !!!
polo987

56
Для тих, хто стикається з проблемою того, що ScrollView не прокручується, встановлення нижньої частини contentView та вирівнювання центральних вертикальних обмежень з низьким пріоритетом зробили для мене трюк!
jimmy0251

98

Ця помилка потребувала певного часу, щоб відстежити, спочатку я спробував закріпити розмір ScrollView, але в повідомленні про помилку чітко написано "розмір вмісту". Я переконався, що все, що я зафіксував зверху ScrollView, було також зафіксовано донизу. Таким чином ScrollView може обчислити свою висоту вмісту, знайшовши висоту всіх об'єктів і обмежень. Це вирішило неоднозначну висоту вмісту, ширина - досить схожа ... Спочатку я мав більшість речей X, зосереджених у ScrollView, але мені також доводилося закріплювати об'єкти збоку ScrollView. Мені це не подобається, тому що iPhone6 ​​може мати ширший екран, але він видалить помилку «неоднозначна ширина вмісту».


31
Спасибі за вашу відповідь! Якщо я правильно вас зрозумів, ви домагаєтесь усунення помилки, закріплюючи кожен підвід у ScrollView вгорі та внизу. Однак це не обов’язково. Вам просто потрібно переконатися, що існує спосіб зробити безперервну лінію обмежень зверху до нижньої частини прокрутки. [-XXX] Я сподіваюся, що це було зрозуміло;>
Wirsing

1
Як виправити проблему, якщо представлення має змінну висоту? Як потім встановити обмеження, щоб перегляд прокрутки міг обчислити розміри?
hashier

2
"Ви просто повинні переконатися, що є спосіб зробити безперервну лінію обмежень від верху до низу прокрутки" <- дякую за це речення
Адам Уайте

3
Що мені допомогло - переконатися, що подання прокрутки було прикріплено до огляду, а не до верхнього або нижнього напрямних макета. Я усунув обмеження для нижнього керівництва макета і перейшов через меню замість конструктора інтерфейсів. Редактор -> Прикріплення -> Простір знизу для перегляду.
Альберто Лопес

2
Якщо ви хочете, щоб ширина екрана прокрутки відповідала ширині екрана вашого телефону або будь-якого іншого елемента вашого інтерфейсу (наприклад, що містить UIView), вам потрібно встановити "рівну ширину" на ньому, використовуючи для вимірювання інший елемент, який знаходиться поза межами прокрутки.
Департамент Б

89

Xcode 11+

Найпростіший спосіб використання autolayout:

  1. Додайте UIScrollViewта закріпіть його 0,0,0,0для перегляду (або потрібного розміру)
  2. Додайте UIViewв ScrollView, закріпіть його 0,0,0,0на всіх 4-х сторонах і відцентруйте його horizontallyта vertically.
  3. За розміром інспектора, змініть bottomта align center Yпріоритет до 250. (для горизонтальної зміни прокрутки trailingта align center X)
  4. Додайте до цього подання всі потрібні перегляди. Не забудьте встановити нижнє обмеження на нижньому погляді.
  5. Виберіть UIScrollView, виберіть інспектор розміру та зніміть позначку Content Layout Guides.

1
Мені не вдалося встановити висоту вмісту прокрутки, але це працює. :)
Сліпа ніндзя

2
Підказка: я працював лише в тому випадку, якщо я видалив центр по горизонталі та вертикалі і замінив його однаковою шириною (scrollView + перегляд всередині scrollView) І додав висоту на основі вмісту, що означає, що останній елемент подання потребує обмеження в нижній частині. Подивіться тут для отримання додаткової інформації: stackoverflow.com/a/54577278/5056173
Шон Stayns

1
Шон, я використовую це буквально кожен день, і у мене ніколи не було проблем з таким підходом, коли мова йде про вертикальне та горизонтальне прокручування огляду прокрутки. Можливо, ви забули поставити нижнє обмеження на найнижчий / останній елемент. Без цього це не вийде.
Đorđe Nilović

7
Точка № 4 - друге речення - це велике.
Nitish

2
ця відповідь чудово працювала для мене
satvinder singh

63

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

Але це повністю охоплює і вашу справу!

Отже, ось початковий стан для найпростішого випадку:

  1. scrollView з 0 обмеженнями для всіх країв
  2. Кнопка зосереджена по горизонталі та вертикалі з обмеженими обмеженнями ширини та висоти
  3. І, звичайно - дратівливі попередження Has ambiguous scrollable content width і Has ambiguous scrollable content height.

1

Все, що нам потрібно зробити:

  • Додайте 2 додаткові обмеження, наприклад, "0" для останнього та / або нижнього простору для нашого перегляду (дивіться приклад на скріншоті нижче).

Важливо: вам потрібно додати обмеження та / або нижнє обмеження. Не "ведучий і топ" - це не працює!

2

Ви можете перевірити це в моєму прикладі проекту , який демонструє, як виправити цю проблему.

PS

За логікою - ця дія повинна викликати "конфліктні обмеження". Але не!

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


Чудова порада! Я закінчив просто створити обмеження до нижнього краю та встановити пріоритет середньому або низькому
Дін

Оце Так! Це серйозно не має сенсу, але працює! Дякую! В останньому пункті, який я маю на увазі, я встановив нижнє обмеження 0 і BANG. Нарешті спрацювали.
Якоб Хвіід

60

Xcode 11+, Swift 5

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

Краї перегляду вмісту (провідні, кінцеві, верхній, нижній) не слід закріплювати, як ведучі на зображенні - до Посібника з макета кадру

Не так

але так - до Посібника з розміщення вмісту.

Виберіть Посібник із розміщення вмісту зі спадного меню

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

І тоді більшість відповідей підійде саме вам.

Найпростіший підхід зараз такий:

  1. Помістіть подання прокрутки у кореневому вікні
  2. Закріпіть усі сторони подання прокрутки до перегляду
  3. Візьміть інший UIView (назвемо його переглядом вмісту) і помістіть його у вікно прокрутки
  4. Закріпіть усі сторони подання вмісту, щоб прокрутити Посібник із розміщення вмісту
  5. Закріпіть ширину подання вмісту, яка дорівнює Посібнику з компонування кадру подання прокрутки
  6. Виправте висоту перегляду вмісту будь-яким способом (я використовував лише постійне обмеження висоти в наведеному нижче прикладі)

Загалом ваша структура в найпростішому варіанті буде виглядати так

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


@WantToKnow Не потрібно обмежувати висоту, просто змініть пріоритет на низький (250)
Reckoner

Xcode 11+, Swift 5. Відповідно до відповіді @WantToKnow, я вирішив свою проблему, підготував [відео] [1] та [код] [2] [1]: youtube.com/watch?v=qMrH5_Yj5hM [2]: github.com/AhmAbdallah/CustomCollectionView
Ахмед Абдалла

1
Це чудова відповідь, дякую.
Костянтин

1
Це правильна відповідь. Дякую.
Вінсент Джой

Це працювало для мене лише тоді, коли я додав нижнє обмеження до останнього елемента перегляду вмісту
Д.Зотов,

49

Вам потрібно створити UIViewяк підперегляд, UIScrollViewяк описано нижче:

  • UIViewController
  • UIView "Головний вигляд"
    • UIScrollView
      • UIView "Перегляд контейнера"
        • [Ваш вміст]

Другий крок - зробити UIScrollViewобмеження. Я зробив це з верхнім, нижнім, провідним і кінцевим обмеженнями на його суперпогляд.

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

"Має неоднозначну ширину вмісту, що прокручується" та "Має неоднозначну висоту вмісту, що прокручується"

Продовжуйте з тими ж обмеженнями, наведеними вище, і просто додайте обмеження Equal Heightта Equal Widthдо перегляду контейнерів стосовно до головного перегляду, а не до вашого UIScrollView. Іншими словами, обмеження перегляду контейнера прив'язані доUIScrollView суперечкою 's.

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


2
Погоджено - я думаю, що додавання перегляду контейнера є найкращим, найрентабельнішим рішенням.
Ендрю Еблінг

1
Це рішення працюватиме, коли у вас немає панелі навігації для управління.
Ліна

25

У мене було те саме питання. Зніміть цей прапорець. Оскільки ви встановлюєте розмір вмісту в коді. введіть тут опис зображення


24

Нарешті я це зрозумів, сподіваюся, це легше зрозуміти.

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

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

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


1
Вищезгадане майже не спрацювало для мене, оскільки я переживаю за 3 різних ширини екрана (4/5, 6, 6+), я встановив перегляд вмісту та перегляд прокрутки на рівні ширини. Ви маєте рацію, це дублікат, оскільки я вже сказав, що у перегляді вмісту є 0 пробілів, що проходять і закінчуються.
Стюарт П.

8
Ви можете встановити однакові обмеження по ширині та висоті з перегляду вмісту для перегляду прокрутки замість постійних значень. Це буде працювати над усіма резолюціями.
Kumar C

Я маю реалізувати те саме, тож чи можете ви допомогти мені, що я повинен встановити рівну висоту і ширину як для перегляду вмісту, так і для прокрутки?
Урмі

Можливо, варто перевірити, чи потрібно це все-таки робити. Нещодавно я встановив imageView в прокрутці, і міг піти, лише встановивши 4 обмеження, показані вгорі, щоб помилка зникала в Xcode 8.3
William T.

1
@Honey це було розміщено більше 3 років тому. З тих пір вони безумовно вдосконалили розповіді. Я теж помітив, що ви можете піти без перегляду вмісту зараз. Я підправлю свою відповідь.
Вільям Т.

16

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

Для перегляду вмісту вам потрібно встановити обмеження для провідних / кінцевих / верхнього / нижнього просторів для прогляду прокрутки, і це не змінить кадр перегляду вмісту , наприклад:введіть тут опис зображення

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

Сподіваюсь, це допомагає.


7

Для мене додавання contentViewнасправді не працювало так, як пропонувалося. Більше того, це створює накладні витрати через доданий погляд (хоча я не вважаю це великою проблемою). Що найкраще працювало для мене, це просто вимкнути неясність для моєї scrollView. Все гарно викладається, тому я думаю, що це нормально у простих випадках, як у мене. Але майте на увазі, що якщо інші обмеження для вашого scrollViewперерви, Інтерфейс-Builder більше не попередить вас про це.

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


5
Це просто видалить попередження і нічого не зробить для вирішення проблеми.
Predrag Manojlovic

Ви. є. моє. герой. Не усвідомлював, що це існує, і я радий знайти його! Я спробував "Перевірити лише позицію", яку ви очікували б, я не знаю, перевірити лише позицію, але ні, це також не дозволяє цю проблему "розмір вмісту". Треба перейти до "Never Verify". Дякую!
Дастін

Я думаю, що це правильна відповідь, якщо ви створюєте дитячий погляд програмно. Дякую!
Флоріан Куще

6

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

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/


3

Дивіться нижче: перегляд вмісту в прокручуванні вертикального та горизонтального централізованого. у вас помилка неоднозначності, завжди переконайтесь, що два додані в перегляд прокрутки зі свого перегляду вмісту - це 1) .простір кнопки до контейнера;

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

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

це може вам допомогти.


3

Я вирішив подібну проблему для свого перегляду, використовуючи "Вирішити проблеми з автоматичним макетом"> "Додати відсутні обмеження" для вибраного перегляду введіть тут опис зображення

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

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

в якому: трейлінг, нижній - кінцевий, нижній - UIScrollView


Це працювало для мене, додаючи обмеження "донизу". Тепер, коли я замислююся над цим, це має ідеальний сенс.
SilverWolf - Відновіть Моніку

3

Використовуючи contentView ( UView) як контейнер всередині UIScrollView, дотримуйтесь країв (top , bottom, trailing, leading) з надтабліци ( UIScrollView) і contentViewповинні мати equalwidthі equalheightдо надтабліце. Це обмеження. І виклик методу:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

Вирішили питання для мене.


3

Підхід Swift 4+:

1) Встановіть верхній, нижній, лівий і правий поля UIScrollView на 0

2) Всередині UIScrollView додайте UIView і встановіть верхню, нижню, ведучу, кінцеві поля до 0 (дорівнює межі UIScrollView).

3) Найважливіша частина - встановити ширину та висоту, де обмеження висоти повинно мати низький пріоритет .

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

2

@Matteo Gobbi відповідь ідеальна, але в моєму випадку прокрутка не може прокручуватися, я видаляю " вирівняти центр Y " і додаю " висота> = 1 ", прокрутки стануть прокручуватися


2

Люди, які борються за перегляд uiscrollview і не прокручують, просто встановлюють обмеження нижнього перегляду вмісту за допомогою нижнього макета останнього перегляду (який знаходиться всередині вашого перегляду вмісту). Не забудьте зняти обмеження у центрі Y.

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

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


2

Я зробив відео на YouTube
Scroll StackViews, використовуючи лише аркуш розгортки в Xcode

Я думаю, що тут можуть з’явитися два види сценаріїв.

Вид всередині scrollView -

  1. не має внутрішнього розміру (наприклад UIView)
  2. має свій власний розмір вмісту (наприклад UIStackView)

Для вертикально прокручуваного виду в обох випадках потрібно додати ці обмеження:

  1. 4 обмеження зверху, зліва, знизу та справа.

  2. Рівня ширини для перегляду прокрутки (для припинення прокрутки по горизонталі)

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

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


Для представлень, які не мають внутрішньої висоти вмісту, потрібно додати обмеження по висоті. Перегляд буде прокручуватися лише в тому випадку, якщо обмеження висоти більше, ніж висота scrollView.

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


2
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // you can use here any of your subview

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

Вихід:

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


для чого вам потрібен LeadAnchor, коли у вас вже залишивсяAnchor?
ShadeToD

leftAnchor не може бути використаний для цієї мети, тому для досягнення того ж ми повинні використовувати LeadAnchor ..
iAj

ви використовували обидва у своєму прикладі.
ShadeToD

@ShadeToD дозвольте мені перевірити
iAj

2

У моєму випадку я отримав питання про неправильний розмір вмісту та неоднозначність вмісту в iPad, але працював у випадку iPhone. Щоб вирішити проблему, я зробив наступні зміни в раскадровці.

  1. Додайте перегляд прокрутки в UIView і додайте обмеження, що ведуть, верх, кінець і низ до 0,0,0,0.
  2. Встановіть висоту подання прокрутки відповідно до вимог, наприклад. 100.
  3. Додайте UIView для перегляду прокрутки та додайте обмеження, що ведуть, зверху, заднім і нижнім до 0,0,0,0 та вирівнюють обмеження по центру (X) та центру (Y).
  4. Зніміть позначку "Настанови щодо вмісту" в інспекторі розміру подання прокрутки.

1

Вертикальна прокрутка

  1. Додайте UIScrollView з обмеженнями 0,0,0,0 для перегляду.
  2. Додайте UIView в ScrollView з обмеженнями 0,0,0,0 для нагляду.
  3. Додайте однакове обмеження ширини для UIView до UIScrollView.
  4. Додайте висоту до UIView.
  5. Додайте елементи з обмеженнями до UIView.
  6. Для елемента, найближчого до нижнього, переконайтеся, що він має обмеження до нижньої частини UIView.

0

Що я зробив, це створити окремий перегляд вмісту, як показано тут.

Перегляд вмісту є вільною формою і може додавати до нього всі підперегляди з власними обмеженнями стосовно contentView.

UIScrollView додається до основного контролера перегляду.

Програматично я додаю contentView, який пов'язаний через IBOutlet до класу, і встановлюю contentView UIScrollView.

UIScrollView з ContentView через Interface Builder


0

Я отримував таку ж помилку .. Я зробив наступне

  1. Перегляд (нагляд)
  2. ScrollView 0,06,600,600
  3. UIView всередині ScrollView: 0,06,600,600
  4. UIView містить перегляд зображення, мітку

Тепер додайте провідний / трейлінг / верхній / нижній для scrollView (2), а потім UIView (3).

Виберіть View (1) і View (3) встановити однаково висоту та вагу .. це вирішило мою проблему.

Я зробив відео, яке допоможе:

https://www.youtube.com/watch?v=s-CPN3xZS1A


0

[протестовано в XCode 7.2 та для iOS 9.2]

Що придушило для мене помилки та попередження в Інтернеті - це встановлення внутрішнього розміру перегляду прокрутки та перегляду вмісту (у моєму випадку - перегляду стека) для заповнювача . Цей параметр знайдено в Інспекторі розмірів у Розділ. І сказано - Настроювання внутрішнього розміру вмісту для дизайну впливає лише на представлення даних під час редагування в Interface Builder. Перегляд не матиме цього внутрішнього розміру вмісту під час виконання.

Отже, я думаю, ми не помилилися, встановивши це.

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

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


0

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

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

Це з документації Apple . Наприклад, якщо ви випадково закріпили верхню мітку / кнопку / імг / вигляд на поданні за межами області прокрутки (можливо, заголовок чи щось вище за scrollView?) Замість contentView, ви заморозили б увесь contentView на місці.


0

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

Спеціальний вид - це ContentView, позначений на зображенні

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

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

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


0

Вам просто потрібно переконатися, що існує спосіб зробити безперервну лінію обмежень зверху до нижньої частини прокрутки. [-XXX]

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



0

Якщо у вас все ще виникають проблеми з UIScrollView, просто вимкніть посібники з розміщення вмісту (виберіть свій ScrollView у програмі Xcode Interface Builder -> виберіть інспектор розміру на правій панелі -> зніміть прапорець "Посібники щодо макета вмісту") або спробуйте виконати наступні кроки: xcode 11 прокрутки макетів перегляду - це може бути корисно для нового стилю компонування. Відмінно працює на macOS 10.15.2, Xcode 11.3.1, за 05.02.2020

див. скріншот


0

Використання автоматичного вимикання

Додайте подання прокрутки до чітко визначеного подання, а потім додайте подання стека всередині подання прокрутки

Додайте верхнє, ліве, праве, нижнє, центральне обмеження X та центр Y від перегляду прокрутки та подання стека до відповідних супервиглядів

Переконайтесь, що обмеження пов'язані від подання стека до правомірного перегляду (перегляду прокрутки), оскільки поточний параметр за замовчуванням - це додати обмеження «Вирівняти верхній», а не «Верхній простір».

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