質問

いて以下のコードを隠し、航行バーがあります。ですが最初のビューの負荷として隠れた場合は"子供"に呼び出されます。トラブルはできませんのイベント/アクションをトリガーで隠再た時に立ち戻ってコンピュータの眺望です。

ている"テスト"ボタンをルートページに手動での行動ではないかしてほしいと思います。

-(void)hideBar 
{
    self.navController.navigationBarHidden = YES;
}
-(void)showBar 
{       
    self.navController.navigationBarHidden = NO;
}
役に立ちましたか?

解決

アコースティックライブに溶いては、次のように行いますの ビューコントローラー.

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

迅速かつ

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's"これらの実施方法に従って文書ま なにスーパークラスの実装のどこかに実装.

他のヒント

私が見つけたもう一つのアプローチはNavigationControllerのデリゲートを設定することです。

navigationController.delegate = self;

setNavigationBarHiddennavigationController: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ための動作をカスタマイズするための簡単な方法を。

私は他の回答にしなければならなかった一つのわずかな微調整は、それが消えている理由はそこにプッシュされているナビゲーションアイテムが原因である場合にのみviewWillDisappearでバーを再表示することです。ビューは、他の理由のために消えることができるからである。

このビューは、もはや最上位の図であるならば、私は唯一のバーを再表示しないだからます:

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

    [super viewWillDisappear: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)
}

現在の受け答えが一致しない動作を記の問題をもたらしていました。の質問を求めのナビゲーションバーそれは、あなたのルートビューコントローラーが至る所に見えるか他の、あなたが受け答えはカルナビゲーションバーに特定のビューのコントローラです。どのようなときは別のインスタンスのコントローラー押しをスタック?で非表示のナビゲーションバーでなくても、私たちのルートビューコントローラです。

代わりに、@M.チャドの 戦略 の利用 UINavigationControllerDelegate は、こちらの方がより完全な解決策です。手順:

  1. サブクラス UINavigationController
  2. の実施を -navigationController:willShowViewController:animated 法表示/非表示のナビゲーションバーに基づくかどうかを示すルートビューコントローラー
  3. オーバーライドの初期化方法にUINavigationControllerサブクラスとして、独自の委譲

完了コードをこのソリューションで この概要.こちらの 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];
    }
}

ここでは、複数の試行の後、私はそれは私が望んでいた何のために働いて得た方法です。 これは私がしようとしていたものです。 - 私がイメージして景色を眺めることができます。そして私は、画像をフルスクリーンに行く持っていると思いました。 - 私もタブバーとナビゲーションコントローラを持っています。だから私は、あまりにもそれを非表示にする必要があります。 - また、私の主な要件がちょうど隠れていませんでしたが、表示や隠しながら、あまりにもフェージング効果を持つ。

これは、私はそれが働いて得た方法です。

ステップ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で、表示ナビゲーションバー

- (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ジェスチャーを追加し、ナビゲーションバーを半透明にします。

- (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];
}

私が信用を@にチャドm'sの答えです。

ここでは迅速なバージョン:

  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のクラス絵コンテをMyNavigationController MyNavigationController しようとしています。

差が、チャドとmの回答および鉱山:

  1. からは継承しUINavigationControllerできない汚染おrootViewController.

  2. 使用 self.viewControllers.firsthomeViewController, なんだこの100倍を100UINavigationControllers1StoryBoard.

の場合には、まだ受け入れ答えにコメントし@fabbとしての速いbackswipeキャンセルバグの持つ問題を抱えて誰ます。

Iは、以下に示すように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が隠されている)と押さビューコントローラ(NAVが示されている)の の異なるステータスバーのスタイルを持っている(例えば、濃淡であることがわかり)。あなたはビューコントローラをポップするbackswipeを開始した瞬間には、追加のステータスバーの色のアニメーションがあるでしょう。あなたはインタラクティブなポップを、キャンセルするために指を離した場合のステータスバーのアニメーションはを終了していない状態で、ナビゲーションバーが永遠に失われている!

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

コントローラで完全にナビゲーションバーを非表示にすることで何がしたい、よりクリーンソリューションがある場合に、ルートコントローラで、のようなものがあります:

@implementation MainViewController
- (void)viewDidLoad {
    self.navigationController.navigationBarHidden=YES;
    //...extra code on view load  
}
あなたは、コントローラ内の子ビューを押すと、

、ナビゲーションバーは非表示のままになります。あなただけの子供にそれを表示したい場合は、あなたがit(self.navigationController.navigationBarHidden=NO;)でそれを隠すために、同様のコードをviewWillAppearコールバックでviewWillDisappearを表示するためのコードを追加し、かつます。

最も単純な実装では、単に、そのナビゲーションバーは、そのviewWillAppear:animated:方法に隠されているか否かを、各ビューコントローラが指定有するようにしてもよいです。同じアプローチは、同様にツールバーを表示/非表示に適しています:

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

唯一の最初のページで非表示ナビゲーションバーは、同様にストーリーボードを介して達成することができます。ストーリーボードでは、後藤のナビゲーションコントローラScene->ナビゲーションバーの。そして、属性インスペクターから 'の隠しの' プロパティを選択の。これは、その必要のViewControllerのために見えるようになるまで、第1のViewControllerから始まるナビゲーションバーを非表示にします。

ナビゲーションバーには、のViewControllerのViewWillAppearコールバックに戻って目に見えるように設定することができます。

-(void)viewWillAppear:(BOOL)animated {

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

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

あなたのViewControllerにこのコードを実装することによって、あなたはこの効果を得ることができます  実際にはトリックが、navigationBarを隠しているコントローラが起動されたとき、

- (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];
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top