Подтвердить что ты не робот

IOS 7 - navigationController устанавливает содержимоеInset и ContentOffset моего UIScrollView

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

4b9b3361

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