#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 — это контроллер контейнера, в котором я реализовал это решение.