ios 消す iPhone は最初のページでのみナビゲーション バーを非表示にします。




uiviewcontroller navigationbar 非 表示 (12)

私が見つけた別のアプローチは、 NavigationControllerデリゲートを設定することです:

navigationController.delegate = self;

navigationController:willShowViewController:animated: 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の動作を1 ViewController簡単にカスタマイズできます。

私は以下のコードを隠して、ナビゲーションバーを表示しています。 最初のビューが読み込まれると非表示になり、「子」が呼び出されると非表示になります。 問題は、ルートビューに戻ったときに再び隠れるようにするイベント/アクションを見つけることができないことです。

私はルートページに手動でアクションを実行する "テスト"ボタンを持っていますが、それはきれいではなく、私はそれを自動にします。

-(void)hideBar 
{
    self.navController.navigationBarHidden = YES;
}
-(void)showBar 
{       
    self.navController.navigationBarHidden = NO;
}

ここで複数の試練の後、私はそれが私が望んだもののために働く方法です。 これは私が試していたものです。 - 私はイメージを持つビューを持っています。 画像をフルスクリーンにしたいと思っていました。 私はタブバーを持つナビゲーションコントローラも持っています。 だから私もそれを隠す必要があります。 - また、私の主な要件は、単に隠れているのではなく、表示したり隠したりしている間もフェーディング効果があったことです。

これは私がそれを働かせる方法です。

ステップ1 - イメージとユーザーのタップをそのイメージに一度持っています。 私はそのジェスチャーをキャプチャし、新しいimageViewControllerプッシュし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];
}

あなたが望むものがコントローラー内のナビゲーションバーを完全に隠すことであるならば、ルートコントローラーでは、もっときれいな解決策があります:

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

コントローラで子ビューを押すと、ナビゲーションバーは非表示のままです。 子にちょうど表示したい場合は、 viewWillAppearコールバックにit(self.navigationController.navigationBarHidden=NO;)を表示するためのコードit(self.navigationController.navigationBarHidden=NO;)を追加し、同様にviewWillDisappear隠すコードをviewWillDisappear


私が他の答えにつけなければならなかった微妙な微妙な調整は、それが消えている理由がナビゲーションアイテムがそれに押し込まれているために、viewWillDisappearのバーを隠すことだけです。 これは、ビューが他の理由で消える可能性があるためです。

このビューがもはや一番上のビューではない場合にのみ、バーを非表示にします。

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

    [super viewWillDisappear:animated];
}

現在受け入れられている回答は、質問に記載されている意図した動作と一致しません。 この質問は、ナビゲーションバーがルートビューコントローラに隠されているが他の場所では表示されていることを尋ねますが、受け入れられた回答は特定のビューコントローラのナビゲーションバーを隠しています。 最初のView Controllerの別のインスタンスがスタックにプッシュされるとどうなりますか? ルートビューコントローラを見ていなくてもナビゲーションバーは隠れてしまいます。

代わりに、@ Chad M.のUINavigationControllerDelegateを使用するstrategyは良いUINavigationControllerDelegateです。ここではより完全な解決策です。 ステップ:

  1. サブクラスUINavigationController
  2. -navigationController:willShowViewController:animated実装する-navigationController:willShowViewController:animatedルートビューコントローラを表示しているかどうかに基づいてナビゲーションバーを表示または非表示にする-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];
    }
}

表示されている各ビューのviewWillAppearデリゲートにコードを挿入します。

あなたがそれを隠す必要がある場所のように:

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

このように表示する必要がある場所:

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

スウィフト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)
}

私が見つけた最も良い解決策は、 最初のView Controllerで次のことを行うことです。

目標-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];
}

迅速

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のこれらのメソッドの実装をオーバーライドしていることに注意してください。また、ドキュメンテーションによれば、 実装のどこかでスーパーの実装を呼び出す必要あります


最初のページにのみナビゲーションバーを隠すことは、ストーリーボードでも達成できます。 ストーリーボードで、 ナビゲーションコントローラのシーン - >ナビゲーションバーに移動します。 Attributesインスペクタから ' Hidden 'プロパティを選択します。 これは、最初のviewcontrollerから始まるナビゲーションバーを、必要なviewcontrollerに対して表示されるまで非表示にします。

ナビゲーションバーは、ViewControllerのViewWillAppearコールバックに戻って設定できます。

-(void)viewWillAppear:(BOOL)animated {

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];                                                  
}

@ fabbが受け入れられた答えにコメントしたため高速バックスワップに問題がある人はまだバグを取り除いています。

私は、以下に示すように、 viewWillAppear/viewWillDisappearに加えて、 viewDidLayoutSubviewsをオーバーライドしてこれを修正することができます:

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が隠されている)とプッシュされたビューコントローラ(navが表示されている) が異なるステータスバースタイル (例えば暗くて明るい)を持っていることがわかります 。 バックコントローラーを起動してView Controllerをポップすると、ステータスバーのカラーアニメーションが追加されます。 ステータスバーアニメーションが終了していない間にインタラクティブポップをキャンセルするために指を離した場合、ナビゲーションバーは永遠に消えてしまいます!

ただし、両方のビューコントローラのステータスバースタイルが同じ場合、このバグは発生しません。


スイフト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)
}

最も単純な実装は、 viewWillAppear:animated:メソッドでナビゲーションバーが非表示になっているかどうかを各View Controllerに指定させることです。 同じアプローチはツールバーを隠す/表示するのにも有効です:

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




hide