У меня есть UIScrollView (на самом деле UICollectionView, но это, вероятно, не имеет значения). Когда он появляется в IOS 7, навигационный контроллер устанавливает значения contentInset и contentOffset в значения, которые я не хочу. Кажется, он пытается настроить строку состояния и панель навигации. Я бы предпочел, чтобы они оставили их в покое. Я исправил это, переопределив методы getter и setter для contentInset и contentOffset, с флагом, чтобы сообщить объекту, должен ли он принимать набор. Но есть ли лучший способ?
IOS 7 - navigationController устанавливает содержимоеInset и ContentOffset моего UIScrollView
Ответ 1
Попробуйте установить self.automaticallyAdjustsScrollViewInsets = NO
в свой основной контроллер.
Это было введено в iOS 7
, поэтому вы можете обернуть это с проверкой версии iOS, если вы поддерживаете iOS 6
и ниже.
Обновление
Если вы используете раскадровки, вы можете сделать это в построителе интерфейса, а также, проверив 'Adjust Scroll View Insets'
для выбранного контроллера.
Ответ 2
У меня была аналогичная проблема, после отклонения viewController, contentOffset из моего tableView был изменен на (0, -64).
Мое решение было немного странным, я пробовал все остальные ответы, но не имел успеха, единственное, что исправляло мою проблему, заключалось в том, чтобы переключить позицию tableView в дереве элементов управления .xib
это был первый элемент управления в родительском представлении:
Я переместил tableView сразу после ImageView и работал:
кажется, что помещать представление таблицы в первую позицию вызывало проблемы, и перемещение представления таблицы в другую позицию устраняло проблему.
P.D. Я не использую autoLayout ни раскадровки
надеюсь, что это может помочь кому-то!
Ответ 3
У меня есть два решения:
1.
self.view = scrollView;
2.
[self.navigationController.toolbar setTranslucent:NO];
Ответ 4
У меня такая же проблема.
-
Настройка
self.automaticallyAdjustsScrollViewInsets = NO
решила проблему для некоторого вида, но не везде. -
Второе решение - установить смещение содержимого в режиме просмотра таблицы/просмотра/прокрутки в viewWillLayoutSubviews:
- (void)viewWillLayoutSubviews { //Arrange the view CGRect tempViewFrame = self.view.frame; if (tempViewFrame.origin.y == 64.0f) { tempViewFrame.origin.y = 0; self.view.frame = tempViewFrame; } }
Ответ 5
Этого достаточно
- (void)viewDidLoad {
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = NO;
Ответ 6
Это устраняет проблему в обоих случаях, когда:
- Отображение строки состояния
-
Отображение строки состояния + панели навигации
override func viewDidLayoutSubviews() { NSLog("ORIGIN: \(self.view.frame.origin.y)") if self.view.frame.origin.y == 0 { if let rect = self.navigationController?.navigationBar.frame { let y = rect.size.height + rect.origin.y self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0) } } else if self.view.frame.origin.y == 44 || self.view.frame.origin.y == 64 { self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) } }
Ответ 7
Другие ответы могут работать для вас, но они не сработали для меня. Что для меня работало, так это вручную установить свойство y
contentOffset
в viewDidLayoutSubviews
и viewWillAppear
:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Set the offset to go below the status bar
collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Set the offset to go below the status bar
collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}
В моем случае у моего контроллера был вид детальной коллекции, который иногда получал скорректированный contentOffset
, а другой - нет. То, как я нормализую это, - это просто вручную отрегулировать его каждый раз. Я хотел, чтобы содержимое было смещено ниже строки состояния, поэтому я использовал высоту строки состояния как значение (отрицательное, потому что я хочу, чтобы содержимое было нажато).