ナビゲーションバーの表示/非表示


158

2つのバーボタンで構成されるナビゲーションバーを備えたアプリがあります。ユーザーが画面をダブルタップしたときに、このナビゲーションバーの表示と非表示を切り替えます。

最初は、ナビゲーションバーを非表示にする必要があります。ユーザーが画面をダブルタップすると、ナビゲーションバーに、iPhoneのフォトギャラリーに表示されるようなアニメーションが表示されます。

どうすればこれを行うことができますか?提案は常に高く評価されています。

回答:


381

これは数行のコードに収まるものではありませんが、これは効果的なアプローチの1つです。

ナビゲーションバーを非表示にするには:

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

それを表示するには:

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

このメソッドのドキュメントは、こちらから入手できます

「ダブルクリック」またはダブルタップをリッスンするには、サブクラスUIViewを作成し、そのサブクラスのインスタンスをビューコントローラのviewプロパティにします。

ビューのサブクラスで、その-touchesEnded:withEvent:メソッドをオーバーライドし、おそらくを使用して、2つの連続するタップ間の時間を測定することにより、一定の時間内に取得するタッチの数をカウントしCACurrentMediaTime()ます。またはからの結果をテストし[touch tapCount]ます。

2回タップすると、サブクラス化されたビューNSNotificationは、ビューコントローラーがリッスンするように登録したものを発行します。

ビューコントローラーは通知を聞くと、前述のコードを使用して、ナビゲーションバーの現在の表示状態に応じて、ナビゲーションバーのisHiddenプロパティの読み取りを通じてアクセスされるナビゲーションバーを非表示または表示するセレクターを起動します。

編集

タップイベントを処理するための私の回答の一部は、おそらくiOS 3.1より前に役立つでしょう。このUIGestureRecognizerクラスは、最近のダブルタップを処理するためのより良いアプローチでしょう。

編集2

ナビゲーションバーを非表示にするSwiftの方法は次のとおりです。

navigationController?.setNavigationBarHidden(true, animated: true)

それを表示するには:

navigationController?.setNavigationBarHidden(false, animated: true)

これがフォトビューアーアプリケーションの場合、ナビゲーションバーを非表示にすると、画像ビューに不快なジャンプが発生します。これを防ぐ方法はわかりません。3.2では、UIGestureRecognizerをダブルタップに使用できます。これは、より洗練されたアプローチです(iPadのATMのみ)。
ポールリンチ2010年

どうもありがとうアレックス、uは私に多くの情報を提供してくれました、私はあなたのガイドラインに従うつもりです..おかげでトン
Shishir.bobby

これはタブバーにも同じですか?タブバーを非表示/表示したい場合、ダンワット私はhvを行いますか?Shishirについて
Shishir.bobby

1
ポールが述べたこの「ジャンプ」を防ぐ方法はありますか?私もまったく同じ問題を抱えていますが、何が原因なのかわかりません。また、誰もそれを偶然見つけたことはありません。
Icky

「ジャンプ」の発生を停止するには、ナビゲーションバーを非表示/表示した後、jcleeが言及するように、スクロールビューのcontentInsetプロパティをリセットする必要があります。すなわち。self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

このコードはあなたを助けます。

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
initWithTarget:self action:@selector(showHideNavbar:)];
[self.view addGestureRecognizer:tapGesture];

-(void) showHideNavbar:(id) sender 
{ 
// write code to show/hide nav bar here 
// check if the Navigation Bar is shown
if (self.navigationController.navigationBar.hidden == NO)
{
// hide the Navigation Bar
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// if Navigation Bar is already hidden
else if (self.navigationController.navigationBar.hidden == YES)
{
// Show the Navigation Bar
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}

16

最初に、iOS用のビューコントローラープログラミングガイドの「ナビゲーションビューの全画面レイアウトの採用」に関するセクションと、カスタムビューの同じセクションに関する説明をお読みください。Photos.appのようなものを実行しようとしている場合は、おそらくスクロールビューを使用しています。ナビゲーションバー(およびステータスバー)の高さを考慮して、スクロールバーにスクロールコンテンツインセットが自動的に追加されるというコメントに注意してください。そのため、直後にスクロールビューのcontentInsetプロパティをゼロ(UIEdgeInsetsZero)にリセットする必要があります。 navigationBarの初期状態とビューが表示される前の設定。

次に、navigationBarまたはステータスバー、あるいはその両方を表示または非表示に切り替えるシングルタップがある場合、メソッドの切り替えで2つのことを行う必要があります。1つ目は、NavigationBarの非表示プロパティを変更する前にスクロールビューのcontentOffsetプロパティを保存し、保存した値をすぐにcontentOffsetに戻すことです。次に、navigationBarHiddenプロパティを変更した後、contentInsetプロパティをUIEdgeInsetsZeroに再度ゼロ設定します。また、ステータスバーを切り替える場合は、navigationBarの状態を変更する前に状態を変更する必要があります。


1
contentOffsetとcontentInsetのメモをありがとうございました。あなたは本当のヒーローです。
Altealice 2016年

同意します、あなたは本当のヒーローです、ここ!どうもありがとう。
ガイタン

9

スウィフト、これを試してください

navigationController?.isNavigationBarHidden = true  //Hide
navigationController?.isNavigationBarHidden = false //Show

または

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show

7

ナビゲーションバーを非表示にするには:

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

ナビゲーションバーを表示するには:

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

iOS 7では、オートコンプリートが実際にこのソリューションを促進し、最高投票数のソリューションとは対照的です。
Alex Zavatone 2014

7

ここに非常に迅速でシンプルなソリューションがあります:

self.navigationController.hidesBarsOnTap = YES;

これはダブルタップではなくシングルタップで機能します。また、現在のビューコントローラーをプッシュまたはポップした後でも、ナビゲーションコントローラーの動作を変更します。

単一のビューコントローラーに対してのみ動作を設定する場合は、viewWillAppear:およびviewWillDisappear:アクション内のコントローラーのこの動作をいつでも変更できます。

ここにドキュメントがあります


5

1つの方法は、属性インスペクターでバーの可視性「ナビゲーションバーを表示する」のチェックを外すことです。

ここに画像の説明を入力してください


2

Swift 4.2およびXcode 10

self.navigationController?.isNavigationBarHidden = true  //Hide
self.navigationController?.isNavigationBarHidden = false  //Show

ナビゲーションバーを最初のVCだけに表示したくないが、2番目のVC onwordに表示したい場合

最初のVCでこのコードを記述します。

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true  //Hide
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}

2

ナビゲーションバーの状態を検出したい場合は、それが非表示/表示であるかどうか。あなたは単に次のコードを使用して検出することができます-

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}


-4

SWIFT CODE:これはiOS 3.2以降で完全に機能します。

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

次に書く

func hideNavBarOntap() {
    if(self.navigationController?.navigationBar.hidden == false) {
        self.navigationController?.setNavigationBarHidden(true, animated: true) // hide nav bar is not hidden
    } else if(self.navigationController?.navigationBar.hidden == true) {
        self.navigationController?.setNavigationBarHidden(false, animated: true) // show nav bar
    }
}

1
これは貧弱なソリューションだと思います。タップジェスチャを追加すると、正しく構成されていない場合、UITableViewやUICollectionViewなどの他のビューのジェスチャを削除できます。また、ブール== trueであるかどうかを確認することは冗長であり、他のプログラマーにこれが良い習慣だと思わせる可能性があります。また、あなたの例ではキャメルケースを誤用しており、エンドブレースがありません。Swift 2.2セレクターも更新されているので注意してください。最後に、swiftはiOS 7以降でのみサポートされており、iOS 3.2では絶対に実行されません
David Rees
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.