IOS7: Зсув UIScrollView в UINavigationController


126

Наразі мігрую свій додаток на ios 7, і я кілька годин затримувався на новому управлінні навігаційним контролером / баром.

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

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

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

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


Інтерфейс Builder_________________________І результат


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

Інтерфейс Builder_________________________І результат

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

Спасибі за вашу допомогу


EDIT

Як ми бачимо на малюнках, першою дочірньою частиною представлення є 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

4
Цей код заважає моєму UIScrollViewпрокручувати. Але без цього я не можу позбутися від компенсації. Зношений ...
scaryguy

9
Цей прапор також можна вимкнути у вашій дошці / ручці, у контролері перегляду є прапорець "Налаштувати прокрутки для перегляду вкладишів". Я так довго стукав головою об стіну, намагаючись розібратися зі своїми проблемами з видами прокрутки та автоматичним розташуванням, що ще більше ускладнюється підтримкою iOS 6 і 7. Тож велике спасибі, що нарешті запропонували рішення!
Ньюц

2
Документ програми скаже вам, що налаштування navigationbar.translucent = ТАК не дозволить навігаційній панелі відсунути вміст вниз. Це найбільша брехня і коштувала мені багато годин роботи до цієї посади. Крім того, потрібно встановити self.automaticallyAdjustsScrollViewInsets = NO; Дуже дякую за цей пост !!!!!!! Яблуко і яблуко?
користувач779764

Я виявив, що це спричинило зміну меж мого UIScrollView на висоту смуги навігації (-64 балів). Я вручну перекреслив це значення до 0, але виявив, що UISrollView все ще прокручуватиметься по осі y і "прив'язується" до уявної лінії в -64. Ваше рішення це вирішило.
gdbj

92

@ Відповідь Юстафінгера спрацювала як шарм і для мене.

Хотілося лише додати, що цей параметр також можна легко налаштувати за допомогою конструктора інтерфейсів.

  1. Виберіть контролер перегляду
  2. Перейдіть на вкладку "Ревізор атрибутів"
  3. Зніміть прапорець "Налаштувати прокрутки Переглянути вставки"
  4. Насолоджуйтесь!

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


Витратили віки, шукаючи цю опцію у властивостях UIScrollView, а не у контролері перегляду! Дякую!
Домінік Вільямс

11

Я зіткнувся з цим самим випуском, але я знайшов досить дивну властивість у ViewController в програмі інтерфейсів, яка, здається, викликала це для мене. Є набір прапорців "Розширені краї". Я зняв прапорець "Під верхніми брусками", і все почало розкладатись належним чином для мене.


Так, цей працював для мене краще, ніж "Налаштувати прокрутки для перегляду прокрутки"
Дмитро

2

Якщо автоматичноAdjustsScrollViewInsets встановлено YES (налаштування за замовчуванням), існує невідповідність у позиції перегляду прокрутки між ios6 та ios7, тому для їх послідовності вам потрібно відключити цей параметр. Однак, ios6 вийде з ладу, якщо він натрапить автоматичноAdjustsScrollViewInsets, тому вам потрібно або зробити автоматичну зміну автоматично AdjustsScrollViewInsets умовно на ios7, або ж вимкнути цю опцію за допомогою розкадрівки / NIB


2

У мене була подібна проблема, після відхилення viewController змістOffset з мого tableView було змінено на (0, -64).

моє рішення було трохи дивним, я спробував усі інші відповіді, але не мав успіху. Єдине, що вирішило мою проблему, було переключити позицію tableView у керуванні дерева .xib

це було перше управління у батьківському перегляді так:

раніше

Я перемістив tableView відразу після ImageView, і він працював:

після

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

PD Я не використовую autoLayout, ані розклади

сподіваюся, що це може комусь допомогти!


Я помітив цю дивну поведінку, я вважаю, що логіка полягає в тому, що scrollViewInsets автоматично налаштовуються, коли перегляд прокрутки - перша дитина. В іншому випадку це не має сенсу, тому що ваш прокрутка, можливо, не на весь екран.
streem

1

Я також стикаюся з цією проблемою.

UIScrollView розмір вмісту обчислюється ОС як інші розміри, джерела, які надає система обмежень - ось чому ОС має сумнів.

Як виправити - слід чітко визначити розмір вмісту UIScrollView:

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

ContentView.Weight = View.Weight і ContentView.Height = View.Height

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


0

Здається, що вирішення проблеми полягає в тому, щоб переглядати файл розкадровки як "iOS 6.1 і новіші" (виберіть файл раскадровки-> Інспектор файлів-> Документ конструктора інтерфейсів-> Переглянути як. Підпогляди позиціонування в цьому режимі показують зсув.


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

Хм, цікаво ... Розглянувши це, ви можете додати варіант = "6xAndEarlier" у верхню частину XIB в елементі документа, оскільки це різниця при гортанні біта, про який я згадував вище. І FYI це питання трапляється і для uiwebview, і для мене.
swhitman

0

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

Я вирішив це, знявши прапорець " Налаштувати вкладки прокрутки" та " Верхні смуги" . Обидва вони знаходяться в інспекторі атрибутів ViewController. Завдяки мільйонів!

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