it-swarm.com.ru

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

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

69
William Jockusch

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

Это было введено в iOS 7, поэтому вы можете обернуть это проверкой версии iOS, если вы поддерживаете iOS 6 и ниже.


Обновление

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

enter image description here

208
KDaker

У меня была похожая проблема, после закрытия viewController, contentOffset из моего tableView был изменен на (0, -64).

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

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

before

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

after

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

Полицейское управление Я не использую autoLayout ни раскадровки

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

25
Chuy47

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

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];
5
amazingthere

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

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

  2. Второе решение состоит в том, чтобы установить смещение содержимого tableview/view/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;
        }
    }
    
2
Savvy iPhone

Достаточно

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;
0
Vlad

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

  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)
        }
    }
    
0
Carlos Javier A. Helguero

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

0
Eric F.