iOS 7-navigationController устанавливает contentInset и ContentOffset моего UIScrollView
У меня есть UIScrollView (на самом деле UICollectionView, но это, вероятно, не имеет значения). Когда он появляется в IOS 7, навигационный контроллер устанавливает его contentInset и contentOffset в значения, которые я не хочу. Кажется, он пытается настроить для строки состояния и панели навигации. Я бы предпочел оставить их в покое. Я исправил это, переопределив методы getter и setter для contentInset и contentOffset, с флагом, чтобы сообщить объекту, должен ли он принимать a набор. Но есть ли лучший способ?
7 ответов:
попробуйте
self.automaticallyAdjustsScrollViewInsets = NO
в главном контроллере вида.Это было представлено в
iOS 7
Так что вы, возможно, захотите, чтобы обернуть, что с прошивкой проверьте версию, если вы поддерживаетеiOS 6
и ниже.
обновление
если вы используете раскадровки, вы можете сделать это в Построителе интерфейса, а также проверив
'Adjust Scroll View Insets'
для выбранного контроллера.
У меня была аналогичная проблема, после увольнения viewController, contentOffset из моего tableView был изменен на (0, -64).
мое решение было немного странным, я попробовал все другие ответы, но не имел успеха, единственное, что исправило мою проблему, - это переключить положение tableView в дереве элементов управления .xib
Это был первый элемент управления в Родительском представлении, как это:
я переместил tableView сразу после ImageView и это сработало:
кажется, что помещение табличного представления в первое положение вызывало проблемы, а перемещение табличного представления в другое положение исправляло проблему.
P. D. я не использую autoLayout ни раскадровки
надеюсь, что это может помочь кому-то!
у меня есть два решения:
1.
self.view = scrollView;
2.
[self.navigationController.toolbar setTranslucent:NO];
у меня такая же проблема.
задание
self.automaticallyAdjustsScrollViewInsets = NO
решена проблема для некоторых видов, но не везде.второе решение заключается в установке контент-смещение таблица/представление/представление ScrollView в 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; } }
этого достаточно
- (void)viewDidLoad { [super viewDidLoad]; self.automaticallyAdjustsScrollViewInsets = NO;
это устраняет проблему в обоих случаях, когда:
- Отображение Строки Состояния
Отображение Строки Состояния + Панель Навигации
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) } }
другие ответы могут работать для вас, но они не работают для меня. То, что сработало для меня, было вручную установить
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
отрегулированный и другие времена нет. То, как я нормализовал его, было просто вручную настроить его каждый раз. Я хотел, чтобы содержимое было смещено ниже строки состояния, поэтому я использовал высоту строки состояния в качестве значения (отрицательно, потому что я хочу, чтобы содержимое было вытеснено).