IOS 7 - navigationController устанавливает содержимоеInset и ContentOffset моего UIScrollView
У меня есть UIScrollView (на самом деле UICollectionView, но это, вероятно, не имеет значения). Когда он появляется в IOS 7, навигационный контроллер устанавливает значения contentInset и contentOffset в значения, которые я не хочу. Кажется, он пытается настроить строку состояния и панель навигации. Я бы предпочел, чтобы они оставили их в покое. Я исправил это, переопределив методы getter и setter для contentInset и contentOffset, с флагом, чтобы сообщить объекту, должен ли он принимать набор. Но есть ли лучший способ?
Ответы
Ответ 1
Попробуйте установить self.automaticallyAdjustsScrollViewInsets = NO
в свой основной контроллер.
Это было введено в iOS 7
, поэтому вы можете обернуть это с проверкой версии iOS, если вы поддерживаете iOS 6
и ниже.
Обновление
Если вы используете раскадровки, вы можете сделать это в построителе интерфейса, а также, проверив 'Adjust Scroll View Insets'
для выбранного контроллера.
![enter image description here]()
Ответ 2
У меня была аналогичная проблема, после отклонения viewController, contentOffset из моего tableView был изменен на (0, -64).
Мое решение было немного странным, я пробовал все остальные ответы, но не имел успеха, единственное, что исправляло мою проблему, заключалось в том, чтобы переключить позицию tableView в дереве элементов управления .xib
это был первый элемент управления в родительском представлении:
![before]()
Я переместил tableView сразу после ImageView и работал:
![after]()
кажется, что помещать представление таблицы в первую позицию вызывало проблемы, и перемещение представления таблицы в другую позицию устраняло проблему.
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
, а другой - нет. То, как я нормализую это, - это просто вручную отрегулировать его каждый раз. Я хотел, чтобы содержимое было смещено ниже строки состояния, поэтому я использовал высоту строки состояния как значение (отрицательное, потому что я хочу, чтобы содержимое было нажато).