it-swarm.com.ru

Показать/скрыть панель навигации, когда представление отображается в iOS 8

Привет коллеги разработчики,

Я удивлен, что не нашел никакой информации об этом конкретном случае использования для iOS 8. Позвольте мне объяснить, у меня есть стек контроллера навигации, в первом представлении скрыта его навигационная панель, когда пользователь нажимает на ячейку новое представление нажата, и мне нужна навигационная панель, показанная в этом представлении, чтобы вернуться (очевидно). На iOS 7 было просто добавить эту строку в viewWillAppear:

 [self.navigationController setNavigationBarHidden:NO animated:YES];

И это работает как шарм. Но с iOS 8 я изо всех сил пытаюсь иметь то же самое поведение. На данный момент мне удалось сделать то же самое с помощью:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
        [self.navigationController setNavigationBarHidden:NO animated:NO];
}
- (void)viewDidLoad {
     [super viewDidLoad];
     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
         self.automaticallyAdjustsScrollViewInsets = NO;
         self.edgesForExtendedLayout = UIRectEdgeNone;
         self.collectionView.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height, 0, 0, 0);
}    }

И изменяя contentInset моих коллекцийView/tableviews все, что мне нужно отобразить. Это будет работать, но это настоящая боль в * (иногда вставка содержимого не требуется, если пользователь выходит из нового viewcontroller).

Для контекста проект был сначала разработан для iOS 6 и 7, так что раскадровки нет, все делается программно. Я портировал приложение на более современную кодовую базу и сделал его универсальным.

Я что-то пропустил ? Есть ли лучший способ справиться с этим в iOS 7/8?

21
nebuto

Вы хотите спрятать его в viewWillAppear и снова показать в viewWillDisappear

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.isHidden = true
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.navigationBar.isHidden = false
}
12
Nick Wargnier

Я думал, что линия это:

self.navigationController.navigationBar.hidden = YES;

Я проверяю это, и это прекрасно работает для меня. , .Попытайся . , ,.

9
iHart

Сделайте это анимированным, чтобы получить плавный переход:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}
8
Patrick Haaser

На iOS 8 кажется, что navigationBarHidden отличается от navigationBar.hidden. (Я строю с целью развертывания iOS 6 - не уверен, если это что-то меняет).

В моем коде, глядя на отладчик со следующими последовательными строками:

bool b1 = self.navigationController.navigationBarHidden; // FALSE

bool b2 = self.navigationController.navigationBar.hidden; // TRUE

b1 отображается как false, а b2 как true.

Установка self.navigationController.navigationBar.hidden = false решает проблему

7
de-bits

У меня была такая же проблема, и я действительно все перепробовал, но панель навигации не появилась. Наконец я понял, что у меня есть этот код в моем первом контроллере представления :-)

[self.navigationController setNavigationBarHidden:YES];

Я подумал, что кто-то еще, кто проверяет этот вопрос, сделал мою ошибку, поэтому я подумал, что стоит упомянуть.

4
Roozbeh Zabihollahi

Есть несколько методов. Меньше трения было бы: 

open class ViewController: UIViewController {
  open var hidesNavigationBarWhenPushed = false

  override open func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(hidesNavigationBarWhenPushed, animated: animated)
  }
}

Но это дало бы вам этот результат .

В качестве альтернативы я бы предложил использовать мою недавно созданную библиотеку HidesNavigationBarWhenPush . Вот объяснение как это работает и почему я его построил.

0
gontovnik