web-dev-qa-db-ja.com

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

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

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

どうすればこれを行うことができますか?提案は常に歓迎されます。

150
iscavengers

これは数行のコードに収まるものではありませんが、これはあなたのために働くかもしれない1つのアプローチです。

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

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

表示するには:

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

このメソッドのドキュメントは こちらから入手可能 です。

「ダブルクリック」またはダブルタップをリッスンするには、UIViewをサブクラス化し、そのサブクラスのインスタンスをView Controllerのviewプロパティにします。

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

2回タップすると、サブクラス化されたビューが NSNotification を発行します。これは、View Controllerがリッスンするために登録したものです。

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

編集

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

EDIT 2

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

self.navigationController?.setNavigationBarHidden(true, animated: true)

表示するには:

self.navigationController?.setNavigationBarHidden(false, animated: true)
364
Alex Reynolds

このコードが役立ちます。

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];
}
}
17
Perjan Duro

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

次に、navigationBarおよび/またはステータスバーを切り替えて表示または非表示にするシングルタップがある場合は、トグルメソッドで2つのことを行う必要があります。最初の方法は、非表示のNavigationBarプロパティを変更する前にスクロールビューのcontentOffsetプロパティを保存し、その直後に保存した値をcontentOffsetに復元することです。次に、navigationBarHiddenプロパティを変更した後、contentInsetプロパティをUIEdgeInsetsZeroに再びゼロにします。また、ステータスバーを切り替える場合は、navigationBarの状態を変更する前に状態を変更する必要があります。

16
jclee

Swiftでこれを試して、

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

または

self.navigationController?.setNavigationBarHidden(true, animated: true) //Hide
self.navigationController?.setNavigationBarHidden(false, animated: true) //SHow
9
Zaid Pathan

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

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

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

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

これは非常に迅速かつ簡単なソリューションです。

self.navigationController.hidesBarsOnTap = YES;

これは、ダブルタップではなくシングルタップで機能します。また、現在のView Controllerをプッシュまたはポップした後でも、Navigation Controllerの動作を変更します。

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

ドキュメント は次のとおりです。

7
amayer171292591

1つの方法は、Attribute Inspector.HopeでBar Visibility "Shows Navigation Bar"のチェックを外すことです。

enter image description here

4
Avijit Nagare

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
iOS

UINavigationControllerプロパティのhidesBarsOnTapは、iOS8 SDKでこれを処理するために出てきます

https://developer.Apple.com/library/prerelease/ios/documentation/UIKit/Reference/UINavigationController_Class/#//Apple_ref/occ/instp/UINavigationController/hidesBarsOnTap

0
theiOSDude