IOS7: смещение UIScrollView в UINavigationController


126

В настоящее время я переношу свое приложение на ios 7 и часами застрял на новом контроллере навигации / управлении панелью.

Раньше, когда у нас был контроллер навигации, у нас был такой фрагмент:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

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

Хорошо, теперь я понятия не имею, как правильно проектировать с помощью конструктора интерфейсов. У меня все еще есть фрагмент для инициализации моего navcontroller. Однако в конструкторе интерфейса для моего MainViewController, если я установил для строки состояния полупрозрачную или непрозрачную панель навигации, у меня будет смещение в 44 пикселя вверху (см. Ниже).


Конструктор интерфейсов _________________________ И результат


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

Конструктор интерфейсов _________________________ И результат

Я думаю, мне здесь что-то действительно не хватает, но я не могу найти ни одной темы или информации о яблоках в Руководстве по переходам iOS7 по этому поводу.

Спасибо за вашу помощь


РЕДАКТИРОВАТЬ

Как мы видим на изображениях, первым дочерним элементом представления является UIScrollView, который содержит обе метки, проблема не возникает, когда нет представления с прокруткой. Он также появляется, если это UITableView. Если метка находится за пределами UIScrollView, для этой метки нет смещения.


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

Я действительно не использую Autolayout, но его использование (установка флажка) не решает проблемы.
streem

С помощью Autolayout вы должны установить ограничения, чтобы представления оставались на месте. Xcode не знает, что вы хотите автоматически.
erdekhayser

Увидев ваше предыдущее изменение, я только что обнаружил вашу проблему. К сожалению, это не самое очевидное решение. Вместо того чтобы пытаться объяснять все заново, я использовал это видео на Youtube, чтобы узнать, как настроить режимы прокрутки. youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be Удачи. Мне потребовалось пару раз, чтобы посмотреть его, чтобы полностью понять, что он делает.
erdekhayser

Ответы:


286

Хорошо, я нашел решение, я установил в своем контроллере свойство:

self.automaticallyAdjustsScrollViewInsets = false

Я не совсем понимаю истинное преимущество этого свойства (или почему значение по умолчанию истинно)

Единственная документация, которую я нашел, была там:

Обновить

В iOS 11 automaticallyAdjustsScrollViewInsetsне рекомендуется

Теперь вы должны использовать:

self.tableView.contentInsetAdjustmentBehavior = .never

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


12
Отличная находка. UIScrollView в раскадровке действительно сложен. Я бы хотел, чтобы Apple сделала это в будущих версиях Xcode.
p0lAris 08

4
Этот код предотвращает UIScrollViewпрокрутку my . Но без этого мне не избавиться от смещения. Weired ...
scaryguy

9
Этот флаг также можно отключить в раскадровке / пере, в контроллере просмотра есть флажок «Настроить прокрутки просмотра». Я так долго бился головой о стену, пытаясь решить свои проблемы с прокруткой и автоматической компоновкой, что еще больше усложняется поддержкой iOS 6 и 7. Так что большое спасибо за то, что наконец предоставили решение!
Newtz

2
Документ приложения сообщит вам, что установка navigationbar.translucent = YES предотвратит перемещение содержимого панели навигации вниз. Это самая большая ложь и стоила мне многих часов работы, пока я не написал этот пост. Кроме того, вы должны установить self.automaticallyAdjustsScrollViewInsets = NO; Спасибо большое за этот пост!!!!!!! Яблоко и яблоко?
user779764

Я обнаружил, что это привело к смещению границ моего UIScrollView вниз на высоту панели навигации (-64 балла). Я вручную переопределил это значение до 0, но обнаружил, что UISrollView все равно будет прокручиваться по оси Y и «привязываться» к воображаемой строке с -64. Ваше решение решило это.
gdbj

92

Ответ @ Justafinger сработал и для меня.

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

  1. Выберите контроллер представления
  2. Перейдите на вкладку "Инспектор атрибутов".
  3. Снимите флажок "Настроить вставки прокрутки просмотра".
  4. Наслаждайтесь!

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


Потратил много времени на поиски этой опции в свойствах UIScrollView, а не View Controller! Спасибо!
Доминик Уильямс

11

Я столкнулся с той же проблемой, но я обнаружил довольно странное свойство ViewController в построителе интерфейса, которое, похоже, вызывало это для меня. Есть набор флажков «Расширить края». Я удалил галочку «Under Top Bars», и все стало для меня правильно раскладываться.


Ага, этот сработал для меня лучше, чем «Настроить вкладки прокрутки»
Дмитрий

2

Если для параметра automaticAdjustsScrollViewInsets установлено значение YES (настройка по умолчанию), существует несоответствие в позиционировании прокрутки между ios6 и ios7, поэтому, чтобы сделать их согласованными, вам необходимо отключить этот параметр. Тем не менее, ios6 выйдет из строя, если он обнаружит автоматическиAdjustsScrollViewInsets, поэтому вам нужно либо сделать программное изменение автоматическиAdjustsScrollViewInsets условным на ios7, либо отключить эту опцию с помощью раскадровки / NIB


2

У меня была аналогичная проблема, после увольнения viewController contentOffset из моего tableView был изменен на (0, -64).

Мое решение было немного странным, я пробовал все другие ответы, но безуспешно, единственное, что устранило мою проблему, - это переключить позицию tableView в дереве элементов управления .xib

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

перед

Я переместил tableView сразу после ImageView, и он сработал:

после

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

П.Д. Я не использую ни autoLayout, ни раскадровки

надеюсь, это может кому-то помочь!


Я заметил это странное поведение, я считаю, что логика заключается в том, что scrollViewInsets автоматически настраивается, когда scrollview является первым дочерним элементом. В противном случае это не имеет смысла, потому что ваш просмотр прокрутки, вероятно, не полноэкранный.
streem

1

Я тоже сталкиваюсь с этой проблемой.

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

Как исправить - Вы должны явно определить размер содержимого UIScrollView:

  1. Вставить прокручиваемый контент в UIView(я переименовал его в ContentView)
  2. Добавить ограничения:

ContentView.Weight = View.Weight и ContentView.Height = View.Height

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


0

Похоже, что обходным решением является просмотр файла раскадровки как «iOS 6.1 и более ранних версий» (выберите файл раскадровки -> Инспектор файлов -> Документ Interface Builder -> Просмотреть как. Позиционирование подвидов в этом режиме показывает смещение.


Ну, я не использую раскадровку. Однако я не уверен, что это проблема с ios6 на ios7, приведенный выше пример был полностью создан с помощью iOS 7. Более того, я отредактировал свой вопрос, он появляется (насколько мне известно) только с uiscrollview и uitableview.
streem

Хм, интересно ... Рассматривая это, вы можете добавить вариант = "6xAndEarlier" в начало XIB в элементе документа, так как это разница при переключении бита, о котором я упоминал выше. И, к вашему сведению, эта проблема возникает и для uiwebview для меня.
swhitman

0

Спасибо, ребята, за решения! Я часами пытался решить проблему. Все было хорошо, когда панель навигации не использовалась, но все пошло наперекосяк, когда я встроил ViewController в NavigationController.

Я решил это, сняв флажки « Настроить вкладки прокрутки» и « Под верхними полосами» . Оба они расположены в инспекторе атрибутов ViewController. Бесконечно благодарен!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.