Можете ли вы установить вставки вида прокрутки для контроллеров контейнеров?

#ios #uiscrollview #uikit

#iOS #uiscrollview #uikit

Вопрос:

У меня есть контроллер контейнера, который отображает строку данных прямо под руководством по компоновке lop.

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

Есть ли какой-либо способ сказать, что вставки вида прокрутки должны быть верхним руководством по компоновке высотой моей панели? Я знаю, что люди будут предлагать мне установить automaticallyAdjustsScrollViewInsets = NO , но я уже пробовал это. Проблема в том, что я, похоже, не могу точно воспроизвести, когда UIKit устанавливает вставки содержимого, и поэтому я получаю всевозможные странные крайние случаи, которые нарушают вставки. Наиболее ярким примером является UITableViewController, где из-за того, что я устанавливаю вставки содержимого вручную, элемент управления обновлением иногда находится не в правильном положении, и когда я заканчиваю обновление, для вставок вида прокрутки устанавливается значение { 0, 0}, поэтому содержимое скрыто за моей панелью и панелью навигации.

ОБНОВЛЕНИЕ: похоже, что вся магия находится внутри методов _setNavigationControllerContentInsetAdjustment UIViewController и _computeAndApplyScrollContentInsetDeltaForViewController UINavigationController.

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

Ответ №1:

Мое решение состояло в том, чтобы самому устанавливать automaticallyAdjustsScrollViewInsets = NO и обрабатывать настройки вставок содержимого.

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

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

FDScrollingTabBarController — это контроллер контейнера, в котором я реализовал это решение.