iOS 7-navigationController устанавливает contentInset и ContentOffset моего UIScrollView


У меня есть UIScrollView (на самом деле UICollectionView, но это, вероятно, не имеет значения). Когда он появляется в IOS 7, навигационный контроллер устанавливает его contentInset и contentOffset в значения, которые я не хочу. Кажется, он пытается настроить для строки состояния и панели навигации. Я бы предпочел оставить их в покое. Я исправил это, переопределив методы getter и setter для contentInset и contentOffset, с флагом, чтобы сообщить объекту, должен ли он принимать a набор. Но есть ли лучший способ?

7 69

7 ответов:

попробуйте self.automaticallyAdjustsScrollViewInsets = NO в главном контроллере вида.

Это было представлено в iOS 7 Так что вы, возможно, захотите, чтобы обернуть, что с прошивкой проверьте версию, если вы поддерживаете iOS 6 и ниже.


обновление

если вы используете раскадровки, вы можете сделать это в Построителе интерфейса, а также проверив 'Adjust Scroll View Insets' для выбранного контроллера.

enter image description here

У меня была аналогичная проблема, после увольнения viewController, contentOffset из моего tableView был изменен на (0, -64).

мое решение было немного странным, я попробовал все другие ответы, но не имел успеха, единственное, что исправило мою проблему, - это переключить положение tableView в дереве элементов управления .xib

Это был первый элемент управления в Родительском представлении, как это:

before

я переместил tableView сразу после ImageView и это сработало:

after

кажется, что помещение табличного представления в первое положение вызывало проблемы, а перемещение табличного представления в другое положение исправляло проблему.

P. D. я не использую autoLayout ни раскадровки

надеюсь, что это может помочь кому-то!

у меня есть два решения:

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];

у меня такая же проблема.

  1. задание self.automaticallyAdjustsScrollViewInsets = NO решена проблема для некоторых видов, но не везде.

  2. второе решение заключается в установке контент-смещение таблица/представление/представление 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;

это устраняет проблему в обоих случаях, когда:

  1. Отображение Строки Состояния
  2. Отображение Строки Состояния + Панель Навигации

    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 отрегулированный и другие времена нет. То, как я нормализовал его, было просто вручную настроить его каждый раз. Я хотел, чтобы содержимое было смещено ниже строки состояния, поэтому я использовал высоту строки состояния в качестве значения (отрицательно, потому что я хочу, чтобы содержимое было вытеснено).