В моем приложении есть раздел «Камера», который представляет собой модально представленный UINavigationController, содержащий CameraView на основе AVFoundation в качестве rootViewController. Пользователь может просматривать свои библиотеки фотографий следующим образом: Выдвигается ViewController (-> Master), который показывает все AssetGroups в TableView. Когда пользователь выбирает группу, выдвигается другой ViewController, показывающий все активы в этой группе в CollectionView. Ради экранного пространства и «стиля» я решил скрыть строку состояния, когда отображается CameraSection (используя setStatusBarHidden:withAnimation:
). Это оставляет NavigationController с панелью навигации, сдвинутой вверх на 20 пикселей (высота строки состояния).
Когда я показываю TableView / CollectionView для просмотра активов, я принимаю это во внимание и соответствующим образом устанавливаю для них conentInset и т. д.
Все это работает хорошо и хорошо, пока приложение не будет отправлено в фоновый режим (кнопка «Домой») при отображении либо TableView, либо CollectionView. (теперь он будет называться "ScrollView")
Когда приложение снова выходит на передний план, «ScrollView» находится в правильном состоянии в течение очень короткого момента, прежде чем его кадр смещается на 44 пикселя вниз. (44px = фактический размер простой панели навигации - без панели состояния).
Вот несколько картинок, иллюстрирующих проблему:
Перед входом в фон (кнопка «Домой»):
После повторного выхода на передний план:
Если вы внимательно посмотрите, вы увидите темную линию у нижнего края панели навигации. На первой фотке все правильно выровнено. Однако во втором случае scrollView, похоже, имеет смещение кадра вниз на 44 пикселя.
Когда contentSize collectionView больше, чем «Screen-Height» (начинает прокручиваться), вы также можете увидеть, что нижний край слишком низкий (например, последняя строка не полностью видна + вставка scrollIndicator также неверна).
Я уже пытался зарегистрироваться для уведомлений, таких как UIApplicationDidBecomeActiveNotification
или UIApplicationDidChangeStatusBarFrameNotification
, и переустановить contentInset и фрейм collectionView в обратном вызове. Ключ-значение, наблюдающий за фреймом collectionView, никогда не выполнял обратный вызов, как KVO "topLayoutGuide" viewController.
Кажется, что кадр незаметно меняется без каких-либо уведомлений или событий. Странно, когда я NSLog фрейм collectionView и contentInset до и после повторного входа, они показывают точно такие же значения!?
Я вообще не использую InterfaceBuilder, поэтому все делается в коде (без AutoLayout).
Буду очень признателен за любую помощь в решении этой проблемы.
На данный момент, боюсь, мне придется довольствоваться написанием собственного навигационного бара и сокрытием навигационного контроллера, чтобы исправить это:/
- Еще одна проблема, которую я заметил: когда вы скрываете строку состояния, механизм scrollToTop в scrollView больше не работает. Я предполагаю, что нажатие должно быть в строке состояния, чтобы начать прокрутку, поэтому, чтобы заставить это работать, скрывая строку состояния, потребуется TapGestureRecog?
ИЗМЕНИТЬ
К вашему сведению, каждый ViewController, который я использую, наследуется от базового класса, который устанавливает automagicallyAdjustScrollViewInset
в NO.