2つのバーボタンで構成されるナビゲーションバーを備えたアプリがあります。ユーザーが画面をダブルタップしたときに、このナビゲーションバーを非表示および表示したいと思います。
最初は、ナビゲーションバーを非表示にする必要があります。ユーザーが画面をダブルタップすると、iPhoneのフォトギャラリーで見られるようなアニメーションがナビゲーションバーに表示されます。
どうすればこれを行うことができますか?提案は常に歓迎されます。
これは数行のコードに収まるものではありませんが、これはあなたのために働くかもしれない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)
このコードが役立ちます。
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];
}
}
まず、iOS用View Controllerプログラミングガイドの「ナビゲーションビューに全画面レイアウトを採用する」セクションと、カスタムビューに同じセクションをお読みください。 Photos.appのようなことをしようとしている場合は、おそらくスクロールビューを使用しています。ナビゲーションバーは、ナビゲーションビュー(およびステータスバー)の高さを考慮してスクロールビューにスクロールコンテンツインセットを自動的に追加するため、スクロールビューのcontentInsetプロパティをゼロ(UIEdgeInsetsZero)にリセットする必要があります。ナビゲーションバーの初期状態を設定し、ビューが表示される前に。
次に、navigationBarおよび/またはステータスバーを切り替えて表示または非表示にするシングルタップがある場合は、トグルメソッドで2つのことを行う必要があります。最初の方法は、非表示のNavigationBarプロパティを変更する前にスクロールビューのcontentOffsetプロパティを保存し、その直後に保存した値をcontentOffsetに復元することです。次に、navigationBarHiddenプロパティを変更した後、contentInsetプロパティをUIEdgeInsetsZeroに再びゼロにします。また、ステータスバーを切り替える場合は、navigationBarの状態を変更する前に状態を変更する必要があります。
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
ナビゲーションバーを非表示にするには:
[self.navigationController setNavigationBarHidden:YES animated:YES];
ナビゲーションバーを表示するには:
[self.navigationController setNavigationBarHidden:NO animated:YES];
これは非常に迅速かつ簡単なソリューションです。
self.navigationController.hidesBarsOnTap = YES;
これは、ダブルタップではなくシングルタップで機能します。また、現在のView Controllerをプッシュまたはポップした後でも、Navigation Controllerの動作を変更します。
単一のView Controllerに対してのみ動作を設定したい場合、viewWillAppear:およびviewWillDisappear:アクション内のコントローラーでこの動作をいつでも変更できます。
ドキュメント は次のとおりです。
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
}
UINavigationControllerプロパティのhidesBarsOnTap
は、iOS8 SDKでこれを処理するために出てきます