Проблемы с ограничениями UIScrollView [дубликат]

4 ответа

Связь между UIScrollView и макетом авто отличается от других аспектов автоматического макета. В принципе, если было разрешено простое автомасштабирование, ничего не прокручивалось. Например, если подчиненное представление прокрутки было закреплено обычным способом с помощью ограничения до 10 точек от верхней части прокрутки, оно было бы абсолютно закреплено там; он никогда не двигался, независимо от того, как прокручивается прокрутка.

Чтобы решить эту проблему, UIScrollView, который использует autolayout, работает совершенно по-новому. Поэтому, когда вы говорите: «Я использую автозапуск», вы должны подготовиться к тому, чтобы вещи работали совсем по-другому. Вы должны либо использовать отдельный просмотр подпрограмм прокрутки с translatesAutoresizingMaskIntoConstraints = YES, либо явный размер содержимого, либо все должно иметь translatesAutoresizingMaskIntoConstraints = NO, а размер содержимого будет выводиться неявно на основе ограничений надзоров.

Это очень хорошо объяснено в https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html

169
ответ дан Cœur 18 August 2018 в 23:16
поделиться
  • 1
    Вас может заинтересовать этот вопрос: stackoverflow.com/questions/14307037/… (не в последнюю очередь из-за щедрости!) Я думаю, что это проблема scrollview / autolayout, но, на мой взгляд, она читается как ошибка - в этом случае представление прокрутки представляет собой табличное представление, и размер содержимого не регулируется должным образом при вращении. – jrturton 20 January 2013 в 22:49
  • 2
    @matt Я не знаю, видели ли вы это поведение, но если вы используете только ограничения макета для определения размера содержимого прокрутки, есть ошибка: прокрутите смещение содержимого от (0, 0), перейдите на другую вкладку или диспетчер модального просмотра, вернитесь назад, и подпункты просмотра прокрутки смещены по смещению содержимого, и вы не можете вернуться. Я был бы признателен, если бы вы это подтвердили и обманули мой радар: openradar.appspot.com/radar?id=2932404 – edelaney05 13 April 2013 в 21:12
  • 3
    @ edelaney05 Я думаю, что могу подтвердить ошибку, но перед отправкой в ​​Apple вы должны сделать демонстрационный проект, особенно. поскольку код копирования и вставки в openradar.appspot.com/radar?id=2932404 даже не компилируется (вы набрали неверное имя constraintsWithVisualFormat:options:metrics:views:). Всегда используйте реальный код, который действительно работает. И кроме того, в реальном проекте вы можете включить фактическое изображение. У людей Apple нет воображения и нет времени; вы должны сделать всю работу за них заранее. – matt 14 April 2013 в 01:37
  • 4
    @ edelaney05 "плечо consectetur pancetta" ???? :) Хорошо. Я на самом деле сделал гораздо более тесно, основываясь на их коде, с изображением, размером с большую картину. Благодаря тому, что прокрутка просматривает красный цвет фона и с протоколированием, было совершенно ясно, что в представлении прокрутки было установлено, что все было правильно (размер содержимого, смещение содержимого), но рисовал изображение не в том месте, то есть смещал на величину от смещения содержимого, когда мы покинули представление. – matt 14 April 2013 в 03:18
  • 5
    @matt baconipsum.com ! :-) Потрясающие. Точно такое же поведение я видел. Прокрутка показывает, что все как «нормальное», но рисунок был неверным с коэффициентом смещения. Спасибо, что подтвердили, что я не сумасшедший (но только в отношении этой ошибки!). – edelaney05 14 April 2013 в 21:12

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

0
ответ дан Community 18 August 2018 в 23:16
поделиться

Несколько вещей.

  1. убедитесь, что включен автозапуск (IB на вкладке «Инспектор файлов»)
  2. Убедитесь, что вы НЕ вносите никаких изменений, которые связаны с границы, рамки и т. д. - все это делается с помощью автоматических ограничений теперь
  3. Убедитесь, что вы держитесь подальше от AutoResizingMask. Это будет соответствовать вашим новым настройкам. Если все сделано правильно, теперь вы можете разместить свою кнопку, и она будет работать отлично. Вот как это делается.

Эта ошибка указывает, что ни ваш ниб, ни элемент управления внутри этого nib НЕ используют автоматическую компоновку.

-3
ответ дан JustLearningAgain 18 August 2018 в 23:16
поделиться
  • 1
    Но UIScrollView является особенным, и ваш ответ не учитывает этот факт. – matt 25 November 2012 в 05:37

Очень важно при использовании автоматической компоновки: вы должны навести правую и / или нижнюю часть последнего подсмотра вправо и / или в нижней части прокрутки. Это представление прокрутки знает размер содержимого. Например:

[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView
                                                 attribute:NSLayoutAttributeRight
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:scrollView
                                                 attribute:NSLayoutAttributeRight
                                                multiplier:1.0
                                                  constant:0]];

Спасибо за этот сайт за отличный пример.

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

159
ответ дан phatmann 18 August 2018 в 23:16
поделиться
  • 1
    Это потрясающе. Я искал простой пример, похожий на тот, который указан в ссылке. Спасибо!!! – pgpb.padilla 20 April 2013 в 05:05
  • 2
    Хотя ответ мата хорош, этот вопрос гораздо более полезен для решения проблем, которые у меня были с его использованием – dmur 30 October 2013 в 00:16
  • 3
    @dmur ". Хотя ответ мата хороший, этот гораздо более практичный подход" - Чувак, это также мой ответ. Он получил код / ​​объяснение из моей книги! Рад, что я смог помочь дважды. :))) – matt 27 March 2014 в 19:29
  • 4
    Это единственное, что сработало. – Yogesh Maheshwari 20 May 2014 в 16:18
  • 5
    В зависимости от того, как вы выкладываете свой scrollView и их подзаголовки, вам может понадобиться привязать ваши вещи к левому или верхнему. В моем случае мне пришлось прикрепить все влево. – ArtSabintsev 9 September 2014 в 00:20
Другие вопросы по тегам:

Похожие вопросы: