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

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

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

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

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

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


Интерфейс Builder _________________________ И результат

JODqs.pngAJjtd.png


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

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

RIhjR.pngPC96b.png

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

Спасибо за помощь


ИЗМЕНИТЬ

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

Ответ 1

ОК, поэтому я нашел решение, я установил в своем контроллере свойство:

self.automaticallyAdjustsScrollViewInsets = false

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

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

Обновление

В iOS 11 automaticallyAdjustsScrollViewInsets устарела

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

self.tableView.contentInsetAdjustmentBehavior = .never

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

Ответ 2

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

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

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

enter image description here

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

before

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

after

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

P.D. Я не использую autoLayout ни раскадровки

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

Ответ 6

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

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

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

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

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

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

Ответ 7

Кажется, что решение для работы - просмотр файла раскадровки как "iOS 6.1 и более ранних" (выберите файл раскадровки → "Инспектор файлов" → "Конструктор интерфейса" - "Просмотр". В подзонах позиционирования в этом режиме отображается смещение.

Ответ 8

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

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