iPhone скрывает панель навигации только на первой странице

Самое большое различие - form.show дает другое окно, в то время как usercontrol не имеет функции, как всплытие без родителя. Остальные вещи одинаковы для обоих элементов управления, таких как beind, полученных из Scrollablecontrol.

366
задан James Webster 27 January 2016 в 12:31
поделиться

14 ответов

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

Objective-C

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

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

Swift

override func viewWillAppear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)
}

override func viewWillDisappear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
} 

Это приведет к анимированию навигационной панели слева ( вместе со следующим представлением), когда вы нажимаете следующий UIViewController в стеке, и анимируете влево (вместе со старым представлением), когда вы нажимаете кнопку возврата на UINavigationBar.

Также обратите внимание, что это не делегированные методы, вы переопределяете реализацию этих методов UIViewController, и согласно документации вы должны вызывать реализацию super где-то в вашей реализации .

1004
ответ дан Zaid Pathan 27 January 2016 в 12:31
поделиться

Скрытие панели навигации только на первой странице может быть достигнуто также через раскадровку. На раскадровке перейдите к Сцена навигации контроллера> Панель навигации . И выберите свойство Hidden 'в инспекторе Attributes . Это скроет панель навигации, начиная с первого viewcontroller, пока она не станет видимой для требуемого viewcontroller.

Навигационная панель может быть возвращена в видимое состояние в обратном вызове ViewWillAppear ViewController.

-(void)viewWillAppear:(BOOL)animated {

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];                                                  
}
0
ответ дан BDL 27 January 2016 в 12:31
поделиться

Внедрив этот код в свой ViewController, вы можете получить этот эффект. На самом деле хитрость заключается в том, чтобы скрыть панель навигации, когда этот контроллер запущен

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

, и показать панель навигации, когда пользователь покидает эту страницу. viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [super viewWillDisappear:animated];
}
-1
ответ дан Dhiru 27 January 2016 в 12:31
поделиться

Swift 4:

В контроллере вида, от которого вы хотите скрыть панель навигации.

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

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
}
0
ответ дан John Riselvato 27 January 2016 в 12:31
поделиться

В случае, если у кого-то все еще есть проблемы с быстрым обратным перемещением , аннулируется ошибка , как @fabb прокомментировал в принятом ответе.

Мне удается исправить это путем переопределения viewDidLayoutSubviews, в дополнение к viewWillAppear/viewWillDisappear, как показано ниже:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

//*** This is required to fix navigation bar forever disappear on fast backswipe bug.
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.navigationController?.setNavigationBarHidden(false, animated: false)
}

В моем случае, я заметил, что это потому, что контроллер корневого представления (где nav скрыт), а контроллер push-представления (показан nav) имеет разные стили строки состояния (например, темный и светлый). В тот момент, когда вы запускаете обратную прокрутку, чтобы открыть контроллер представления, появится дополнительная цветовая анимация строки состояния. Если вы отпустите палец, чтобы отменить интерактивное всплывающее окно, , пока анимация строки состояния не завершена , панель навигации исчезнет навсегда!

Однако эта ошибка не возникает, если стили строки состояния обоих контроллеров представления одинаковы.

3
ответ дан aunnnn 27 January 2016 в 12:31
поделиться

в Swift 3:

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


override func viewWillDisappear(_ animated: Bool) {
    if (navigationController?.topViewController != self) {
        navigationController?.navigationBar.isHidden = false
    }
    super.viewWillDisappear(animated)
}
14
ответ дан Eugene Braginets 27 January 2016 в 12:31
поделиться

Другой подход, который я нашел, состоит в том, чтобы установить делегата для NavigationController:

navigationController.delegate = self;

и использовать setNavigationBarHidden в navigationController:willShowViewController:animated:

- (void)navigationController:(UINavigationController *)navigationController 
      willShowViewController:(UIViewController *)viewController 
                    animated:(BOOL)animated 
{   
    // Hide the nav bar if going home.
    BOOL hide = viewController != homeViewController;
    [navigationController setNavigationBarHidden:hide animated:animated];
}

Простой способ настройки поведение для каждого ViewController все в одном месте.

46
ответ дан Borzh 27 January 2016 в 12:31
поделиться

Отдайте должное ответу @ chad-m.

Вот версия Swift:

  1. Создать новый файл MyNavigationController.swift

import UIKit

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController == self.viewControllers.first {
            self.setNavigationBarHidden(true, animated: animated)
        } else {
            self.setNavigationBarHidden(false, animated: animated)
        }
    }

}
  1. Установить класс вашего UINavigationController в StoryBoard на MyNavigationController MyNavigationController Вот и все!

Разница между ответом chad-m и моим:

  1. Наследуйте от UINavigationController, так что вы не будете загрязнять свой rootViewController.

  2. используйте self.viewControllers.first, а не homeViewController, поэтому вы не будете делать это 100 раз для ваших 100 контроллеров UINavigation в 1 StoryBoard.

4
ответ дан AI Lion 27 January 2016 в 12:31
поделиться

Если вы хотите полностью скрыть панель навигации в контроллере, гораздо более чистое решение заключается в том, чтобы в корневом контроллере было что-то вроде:

@implementation MainViewController
- (void)viewDidLoad {
    self.navigationController.navigationBarHidden=YES;
    //...extra code on view load  
}

Когда вы перемещаете дочернее представление в контроллер, панель навигации останется скрытой; если вы хотите отобразить его только в дочернем элементе, вы добавите код для отображения it(self.navigationController.navigationBarHidden=NO;) в обратном вызове viewWillAppear и аналогичным образом код для его скрытия на viewWillDisappear

1
ответ дан Paras Joshi 27 January 2016 в 12:31
поделиться

Я бы поместил код в делегат viewWillAppear для каждого отображаемого представления:

Вот так, где вам нужно его скрыть:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject hideBar];
}

Вот так где вам нужно показать это:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject showBar];
}
16
ответ дан Pablo Santa Cruz 27 January 2016 в 12:31
поделиться

Одна небольшая настройка, которую я должен был сделать на других ответах, состоит в том, чтобы только показать панель в viewWillDisappear, только если она исчезает из-за нажатия на нее элемента навигации. Это потому, что вид может исчезнуть по другим причинам.

Таким образом, я могу только показать панель, если этот вид больше не является самым верхним видом:

- (void) viewWillDisappear:(BOOL)animated
{
    if (self.navigationController.topViewController != self)
    {
        [self.navigationController setNavigationBarHidden:NO animated:animated];
    }

    [super viewWillDisappear:animated];
}
17
ответ дан 27 January 2016 в 12:31
поделиться

Простейшая реализация может состоять в том, чтобы каждый контроллер вида указывал, скрыта ли его панель навигации в его методе viewWillAppear:animated:. Тот же подход хорошо работает и для скрытия / отображения панели инструментов:

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setToolbarHidden:YES/NO animated:animated];
    [super viewWillAppear:animated];
}
0
ответ дан Paras Joshi 27 January 2016 в 12:31
поделиться

После нескольких испытаний я понял, как это работает для того, что я хотел. Это то, что я пытался. - У меня есть вид с изображением. и я хотел, чтобы изображение было полноэкранным. - У меня есть навигационный контроллер с TabBar тоже. Так что мне тоже нужно это скрывать. - Кроме того, моим главным требованием было не просто скрываться, но и иметь эффект затухания при показе и скрытии.

1111 Вот так я и заработал.

Шаг 1 - У меня есть изображение, и пользователь нажимает на это изображение один раз. Я фиксирую этот жест и вставляю его в новый imageViewController, в imageViewController, я хочу получить полноэкранное изображение.

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {  
NSLog(@"Single tap");
ImageViewController *imageViewController =
[[ImageViewController alloc] initWithNibName:@"ImageViewController" bundle:nil];

godImageViewController.imgName  = // pass the image.
godImageViewController.hidesBottomBarWhenPushed=YES;// This is important to note. 

[self.navigationController pushViewController:godImageViewController animated:YES];
// If I remove the line below, then I get this error. [CALayer retain]: message sent to deallocated instance . 
// [godImageViewController release];
} 

Шаг 2 - Все эти шаги ниже находятся в ImageViewController

Шаг 2.1 - В ViewDidLoad показать navBar

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"viewDidLoad");
[[self navigationController] setNavigationBarHidden:NO animated:YES];
}

Шаг 2.2 - В viewDidAppear установить задание таймера с задержкой (у меня установлено время задержки 1 сек). А после задержки добавьте эффект затухания. Я использую альфа, чтобы использовать затухание.

- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"viewDidAppear");

myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self     selector:@selector(fadeScreen) userInfo:nil repeats:NO];
}

- (void)fadeScreen
{
[UIView beginAnimations:nil context:nil]; // begins animation block
[UIView setAnimationDuration:1.95];        // sets animation duration
self.navigationController.navigationBar.alpha = 0.0;       // Fades the alpha channel of   this view to "0.0" over the animationDuration of "0.75" seconds
[UIView commitAnimations];   // commits the animation block.  This Block is done.
}

шаг 2.3 - В viewWillAppear добавьте жест SingleTap к изображению и сделайте navBar полупрозрачным.

- (void) viewWillAppear:(BOOL)animated
{

NSLog(@"viewWillAppear");


NSString *path = [[NSBundle mainBundle] pathForResource:self.imgName ofType:@"png"];

UIImage *theImage = [UIImage imageWithContentsOfFile:path];

self.imgView.image = theImage;

// add tap gestures 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];  
[self.imgView addGestureRecognizer:singleTap];  
[singleTap release];  

// to make the image go full screen
self.navigationController.navigationBar.translucent=YES;
}

- (void)handleTap:(UIGestureRecognizer *)gestureRecognizer 
{ 
 NSLog(@"Handle Single tap");
 [self finishedFading];
  // fade again. You can choose to skip this can add a bool, if you want to fade again when user taps again. 
 myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self  selector:@selector(fadeScreen) userInfo:nil repeats:NO];
 }

Шаг 3 - Наконец, в viewWillDisappear, убедитесь, что все вещи обратно

- (void)viewWillDisappear: (BOOL)animated 
{ 
self.hidesBottomBarWhenPushed = NO; 
self.navigationController.navigationBar.translucent=NO;

if (self.navigationController.topViewController != self)
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

[super viewWillDisappear:animated];
}
6
ответ дан CristiC 27 January 2016 в 12:31
поделиться

В настоящее время принятый ответ не соответствует предполагаемому поведению, описанному в вопросе. Вопрос требует, чтобы панель навигации была скрыта на корневом контроллере представления, но видна везде, но принятый ответ скрывает панель навигации на конкретном контроллере представления. Что происходит, когда другой экземпляр первого контроллера представления помещается в стек? Он скроет панель навигации, даже если мы не смотрим на контроллер корневого представления.

Вместо этого, стратегия @Chad M. по использованию UINavigationControllerDelegate является хорошей, и вот более полное решение. Шаги:

  1. Подкласс UINavigationController
  2. Реализуйте метод -navigationController:willShowViewController:animated, чтобы показать или скрыть панель навигации в зависимости от того, показывает ли она контроллер корневого представления
  3. Переопределите методы инициализации, чтобы установить подкласс UINavigationController в качестве своего собственного делегата

Полный код для этого решения можно найти в этой Gist . Вот реализация navigationController:willShowViewController:animated:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    /* Hide navigation bar if root controller */
    if ([viewController isEqual:[self.viewControllers firstObject]]) {
        [self setNavigationBarHidden:YES animated:animated];
    } else {
        [self setNavigationBarHidden:NO animated:animated];
    }
}
12
ответ дан Community 27 January 2016 в 12:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: