UIScrollView прокручиваемый размер содержимого неоднозначность

Товарищи разработчики, у меня проблемы с AutoLayout в Интерфейсном Разработчике (Xcode 5 / iOS 7). Это очень просто и важно, поэтому я думаю, что каждый должен знать, как это правильно работает. Если это ошибка в Xcode, то она критическая!

Поэтому, когда у меня есть такая иерархия представлений, я сталкиваюсь с проблемами:

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

UIScrollView имеет твердые ограничения, например, 50 пикселей со всех сторон (без проблем). Затем я добавляю ограничение Top Space в UILabel (без проблем) (и я могу даже зафиксировать высоту / ширину метки, ничего не меняя, но должно быть излишним из-за собственного размера метки)

Проблема начинается, когда я добавляю конечное ограничение к UILabel:

Например, пробел в: Superview Равно: 25

Теперь появляются два предупреждения - и я не понимаю, почему:

A) Неоднозначность прокручиваемого размера контента (вид прокрутки имеет неоднозначную высоту / ширину прокручиваемого содержимого)

B) Неверные представления (ожидаемая метка: x= -67 Фактическая: x= 207

Я сделал этот минимальный пример в новом проекте, который вы можете загрузить, и приложил скриншот. Как вы можете видеть, Interface Builder ожидает, что Label будет находиться за пределами границы UIScrollView (оранжевый пунктирный прямоугольник). Обновление фрейма метки с помощью инструмента устранения проблем перемещает его прямо туда.

Обратите внимание: если вы замените UIScrollView на UIView, поведение будет таким, как ожидалось (рамка метки правильна и соответствует ограничению). Так что, кажется, либо проблема с UIScrollView, либо я упускаю что-то важное.

Когда я запускаю приложение без обновления фрейма метки, как предлагает IB, он очень хорошо позиционируется, именно там, где он должен быть, и UIScrollView можно прокручивать. Если я ДЕЙСТВИТЕЛЬНО обновляю фрейм, метка исчезает из виду, а UIScrollView не прокручивается.

Помоги мне Оби-Ван Кеноби! Почему неоднозначное расположение? Почему неуместный вид?

Вы можете скачать образец проекта здесь и попробовать, если вы можете выяснить, что происходит: https://github.com/Wirsing84/AutoLayoutProblem

Иллюстрация проблемы в Интерфейсном Разработчике

24 ответа

Решение

ПРИМЕЧАНИЕ: на iOS > 10.0 это не было проверено; поэтому решение может быть неполным в определенных ситуациях.

Так что я просто разобрался таким образом:

  1. Внутри UIScrollView добавить UIView (мы можем назвать это contentView);

  2. В этом contentView установите верхнее, нижнее, левое и правое поля на 0 (конечно, из scrollView какой superView); Установите также выравнивать центр по горизонтали и вертикали;

Закончено

Теперь вы можете добавить все свои взгляды в этом contentView и contentSize из scrollView будет автоматически изменен в соответствии с contentView,

Обновить:

Некоторые особые случаи описаны в этом видео, размещенном Sergio в комментариях ниже.

iOS 12, Swift 4

Самый простой способ с помощью autolayout:

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

Xcode 11+, Swift 5

Если вам интересно, почему все ответы больше не работают, убедитесь, что вы закрепили представление содержимого (то, которое вы поместили внутри представления прокрутки) в Руководство по макету содержимого в режиме прокрутки, а НЕ в Руководство по макету кадра.

Края представления содержимого (ведущие, замыкающие, верхние, нижние) не должны быть закреплены, как ведущие на изображении - к Руководству по макету кадра

а вот так - в Content Layout Guide.

И тогда большинство ответов будут работать для вас.

Самый простой подход сейчас выглядит так:

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

В целом ваша структура в простейшей реализации будет выглядеть так

Эта ошибка заняла у меня какое-то время, чтобы отследить, сначала я попытался закрепить размер ScrollView, но в сообщении об ошибке четко указано "размер содержимого". Я удостоверился, что все, что я прикрепил от вершины ScrollView, было также прикреплено к основанию. Таким образом, ScrollView может рассчитать высоту своего содержимого, найдя высоту всех объектов и ограничений. Это решило неоднозначную высоту содержимого, ширина была примерно одинаковой... Изначально у меня было большинство элементов X по центру в ScrollView, но я также должен был прикрепить объекты к стороне ScrollView. Мне это не нравится, потому что iPhone6 ​​может иметь более широкий экран, но он уберет ошибку "неоднозначной ширины содержимого".

Это ответ на мой вопрос UIScrollView + Центрированный вид + Неоднозначный прокручиваемый размер контента + множество размеров iPhone.

Но это полностью покрывает и ваше дело!

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

  1. scrollView с 0 ограничениями для всех ребер
  2. Горизонтальные и вертикальные по центру кнопки с фиксированными ограничениями ширины и высоты
  3. И, конечно же, раздражающие предупреждения Has ambiguous scrollable content width а также Has ambiguous scrollable content height,

1

Все, что нам нужно сделать, это:

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

Важно: вы должны добавить трейлинг и / или нижние ограничения. Не "ведущий и топ" - это не работает!

2

Вы можете проверить это в моем примере проекта, который демонстрирует, как решить эту проблему.

PS

Согласно логике - это действие должно вызывать "противоречивые ограничения". Но нет!

Я не знаю, почему это работает и как XCode определяет, какое ограничение является более приоритетным (потому что я не установил приоритет для этих ограничений). Я буду благодарен, если кто-то объяснит, почему это работает в комментариях ниже.

У меня была такая же проблема и после поиска по документации и не поиска приемлемого решения. Вам необходимо создать UIView как подпредставление UIScrollView, как описано ниже:

  • UIViewController
  • UIView 'Главный вид'
    • UIScrollView
      • UIView 'Вид контейнера'
        • [Ваш контент]

Вторым шагом является создание ограничений UIScrollView. Я сделал это с верхним, нижним, ведущим и конечным ограничениями для его superView.

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

"Имеет неоднозначную ширину прокручиваемого содержимого" и "Имеет неоднозначную высоту прокручиваемого содержимого"

Продолжайте использовать те же ограничения, что и выше, и просто добавьте ограничения "Равная высота" и "Равная ширина" к своему представлению контейнера относительно основного вида, а не к вашему UIScrollView. Другими словами, ограничения Контейнерного Представления связаны с суперпредставлением UIScrollView.

После этого у вас не будет предупреждений в раскадровке, и вы сможете продолжить добавлять ограничения для ваших подпредставлений.

Я надеюсь, что это помогает кому-то.

Я была такая же проблема. Снимите этот флажок. Поскольку вы устанавливаете размер содержимого в коде.

Я наконец понял это, я надеюсь, что это легче понять.

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

Как видите, вам нужно всего 6 параметров! Что... при нормальных обстоятельствах вы дублируете 2 ограничения, но это способ избежать этой ошибки раскадровки.

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

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

Конечно, вам нужно создать дополнительные ограничения для представления контента, чтобы представление прокрутки могло знать размер контента. Например, установите фиксированную высоту и центр х.

Надеюсь это поможет.

Для меня добавление contentView на самом деле не работает, как предлагалось. Кроме того, это создает издержки из-за добавленного представления (хотя я не считаю это большой проблемой). Для меня лучше всего было просто отключить проверку неоднозначности для моего scrollView, Все хорошо выглядит, так что я думаю, что это нормально в простых случаях, таких как мой. Но имейте в виду, что если другие ограничения для вашего scrollView сломайте, Interface-Builder больше не будет предупреждать вас об этом.

Свифт 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
}

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

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

Я решил эту проблему для своего вида, используя "Устранение проблем с автоматическим макетом"> "Добавить отсутствующие ограничения" для выбранного представления.

Следующие два ограничения решают мою проблему:

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

в котором: трейлинг, низ - трейлинг, низ UIScrollView

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

  1. Добавьте scrollview в UIView и добавьте ограничения вперед, вверх, в конце и внизу до 0,0,0,0.
  2. Установите высоту прокрутки в соответствии с требованиями, например. 100.
  3. Добавьте UIView для прокрутки просмотра и добавьте ограничения вперед, вверх, вниз и вниз до 0,0,0,0 и выровняйте ограничения по центру (X) и центру (Y).
  4. Снимите флажок "Руководства по макету содержимого" в инспекторе размеров в режиме прокрутки.

Используя contentView (UView) в качестве контейнера внутри UIScrollView, придерживайтесь краев (сверху, снизу, сзади, вперед) суперпредставления (UIScrollView) и contentView должны иметь равную ширину и высоту с суперпредставлением. Это ограничения. И вызов метода:

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

Решенные проблемы для меня.

См. Ниже: представление контента в вертикальной и горизонтальной горизонтальной прокрутке. вы получили ошибку неоднозначности, всегда следите за тем, чтобы в представление прокрутки добавлялись два из них: 1).button space to container.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
    }
}

Выход:

Если у вас все еще есть проблемы с UIScrollView, просто отключите Руководства по макету содержимого(выберите ScrollView в xcode Interface Builder -> выберите "Инспектор размеров" на правой панели -> снимите флажок "Руководства по макету содержимого") Или попробуйте следующие шаги: макеты прокрутки xcode 11 - это может быть полезно для нового стиля верстки. Прекрасно работает на macOS 10.15.2, Xcode 11.3.1, на 05.02.2020

см. скриншот

Я сделал видео на YouTube
Прокрутите StackViews, используя только раскадровку в XCode

Я думаю, что 2 вида сценариев могут появиться здесь.

Вид внутри scrollView -

  1. не имеет внутреннего содержимого Размер (например, UIView)
  2. имеет свой собственный размер содержимого (например, UIStackView)

Для просмотра с вертикальной прокруткой в ​​обоих случаях необходимо добавить следующие ограничения:

  1. 4 ограничения сверху, слева, снизу и справа.

  2. Равная ширина прокрутки (чтобы остановить горизонтальную прокрутку)

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


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

@Matteo Gobbi - идеальный ответ, но в моем случае прокрутка не может прокручиваться, я убираю "Выровнять поцентру Y" и добавляю "height> = 1", прокрутка становится прокручиваемой

Если кто-то испытывает поведение, когда вы замечаете полосу прокрутки на правильных прокрутках, но содержимое не перемещается, этот факт, вероятно, стоит рассмотреть:

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

Это из документации Apple. Например, если вы случайно прикрепили верхний ярлык / кнопку / изображение / вид к виду за пределами области прокрутки (может быть, заголовок или что-то чуть выше scrollView?) Вместо contentView, вы бы заморозили весь свой contentView на месте.

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

Остальные все ограничения такие же, как определено выше. Scrollview заботится только о том, чтобы получить максимальную высоту из его представления содержимого, и мы устанавливаем его как нижнее ограничение последнего представления, что означает, что scrollview автоматически изменит смещение содержимого.

В моем случае последнее представление было UILable без свойства lines = 0(которое автоматически регулирует его высоту в зависимости от его содержимого), поэтому оно динамически увеличивало высоту uilable, и в итоге наша прокручиваемая область увеличивается, поскольку нижний макет uilable выравнивается по низу нашего представления содержимого, что заставляет scrollview увеличивать смещение контента.

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

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

Для любого представления размер кадра и его содержимого одинаковы, т.е. если у вас есть некоторый контент (например, изображение) с размером 200 * 800, тогда его кадр также будет 200 * 800.

Это НЕ верно для содержимого scrollview. Содержимое обычно больше, чем размер кадра scrollView. Если контент такой же по ширине, прокрутка выполняется только по вертикали. Если это такая же высота, вы прокручиваете только по горизонтали. Следовательно, это единственное представление, которое требует 6 ограничений, а не 4. Для любого другого представления наличие более 4 требуемых ограничений вызовет конфликт.


Чтобы настроить представление прокрутки, его содержимое и положение прокрутки, вам необходимо ответить на три вопроса:

  1. Насколько велика моя рама? то есть в любой момент, насколько большим должен быть scrollview? например, я хочу использовать только половину высоты экрана, поэтому
scrollview.frame = (x: 0, y:0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height / 2)
  1. Сколько места для прокрутки мне нужно? т.е. насколько велик содержание? например, рамка может иметь ширину всего 500 точек, но затем вы можете установить изображение с 7000 точками, что займет довольно много времени для горизонтальной прокрутки. Или пусть это будет ровно 500 точек ширины, что означает невозможность горизонтальной прокрутки.

  2. Сколько вы уже прокручивали? Допустим, ширина вашего контента (или изображения) составляла 7000, а размер кадра - всего 500. Чтобы добраться до конца изображения, вам нужно прокрутить 6500 точек вправо. Третья часть никак не влияет на ограничения. Вы можете пока игнорировать это. Понимание этого просто помогает понять, как работает scrollView.

Решение

Обычно, если вы не учитываете 2 дополнительных ограничения (о размере содержимого), то механизм компоновки будет жаловаться на двусмысленность. Он не будет знать, какая область содержимого скрыта (не отображается в scrollView), а какая область содержимого не скрыта (отображается в scrollView).

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

Но иногда я не добавляю ограничения по размеру к своим представлениям, и это просто работает. Это почему?

Если все содержимое, которое вы добавили в scrollview, ограничено краями scrollview, то по мере роста содержимого scrollview будет добавлять пространство для размещения. Просто вы можете использовать UIViewгде это intrinsicContentSize является 0поэтому scrollView по-прежнему будет жаловаться на неоднозначность своего содержимого. Однако если вы использовали UILabel и у него есть непустой текст, тогда его intrinsicContentSize установлен (на основе размера шрифта и длины текста, разрывов строк и т. д.), поэтому scrollView не будет жаловаться на его двусмысленность.

Использование Autolayout

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

Добавьте ограничения сверху, слева, справа, снизу, по центру X и по центру Y из представления прокрутки и представления стека в соответствующие суперпредставления.

Убедитесь, что ограничения связаны из представления стека с правом супервизора (scrollview), поскольку текущая настройка по умолчанию - добавить ограничение Align Top, а не Top Space.

Как упоминалось в предыдущих ответах, вы должны добавить пользовательский вид в представление прокрутки:

Пользовательский вид - это ContentView, отмеченный на изображении

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

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

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

Установите размер ViewController (тот, который содержит UIScrollView) на Freeform в Инспекторе размеров в Интерфейсном Разработчике, и все должно работать.

Настройка произвольной формы в Инспекторе размера в Интерфейсном Разработчике для содержащего UIViewcontroller

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

В моем случае - представление с горизонтальной прокруткой прокрутки - мне также нужно было добавить ограничения ширины и высоты для каждого дочернего элемента представления прокрутки, хотя в технической заметке Apple об этом не говорится.

Что я сделал, это создал отдельный вид контента, как показано здесь.

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

UIScrollView добавляется в контроллер основного вида.

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

UIScrollView с ContentView через Интерфейсный Разработчик

Я получаю ту же ошибку.. я сделал следующее

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

Теперь добавьте начальные / конечные / верхние / нижние для scrollView(2), а затем UIView(3).

Выберите View(1) и View (3), чтобы установить одинаковый рост и вес. Это решило мою проблему.

Я сделал видео, которое поможет:

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

Другие вопросы по тегам