2つのバーボタンで構成されるナビゲーションバーを備えたアプリがあります。ユーザーが画面をダブルタップしたときに、このナビゲーションバーの表示と非表示を切り替えます。
最初は、ナビゲーションバーを非表示にする必要があります。ユーザーが画面をダブルタップすると、ナビゲーションバーに、iPhoneのフォトギャラリーに表示されるようなアニメーションが表示されます。
どうすればこれを行うことができますか?提案は常に高く評価されています。
2つのバーボタンで構成されるナビゲーションバーを備えたアプリがあります。ユーザーが画面をダブルタップしたときに、このナビゲーションバーの表示と非表示を切り替えます。
最初は、ナビゲーションバーを非表示にする必要があります。ユーザーが画面をダブルタップすると、ナビゲーションバーに、iPhoneのフォトギャラリーに表示されるようなアニメーションが表示されます。
どうすればこれを行うことができますか?提案は常に高く評価されています。
回答:
これは数行のコードに収まるものではありませんが、これは効果的なアプローチの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)
このコードはあなたを助けます。
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用のビューコントローラープログラミングガイドの「ナビゲーションビューの全画面レイアウトの採用」に関するセクションと、カスタムビューの同じセクションに関する説明をお読みください。Photos.appのようなものを実行しようとしている場合は、おそらくスクロールビューを使用しています。ナビゲーションバー(およびステータスバー)の高さを考慮して、スクロールバーにスクロールコンテンツインセットが自動的に追加されるというコメントに注意してください。そのため、直後にスクロールビューのcontentInsetプロパティをゼロ(UIEdgeInsetsZero)にリセットする必要があります。 navigationBarの初期状態とビューが表示される前の設定。
次に、navigationBarまたはステータスバー、あるいはその両方を表示または非表示に切り替えるシングルタップがある場合、メソッドの切り替えで2つのことを行う必要があります。1つ目は、NavigationBarの非表示プロパティを変更する前にスクロールビューのcontentOffsetプロパティを保存し、保存した値をすぐにcontentOffsetに戻すことです。次に、navigationBarHiddenプロパティを変更した後、contentInsetプロパティをUIEdgeInsetsZeroに再度ゼロ設定します。また、ステータスバーを切り替える場合は、navigationBarの状態を変更する前に状態を変更する必要があります。
でスウィフト、これを試してください
navigationController?.isNavigationBarHidden = true //Hide
navigationController?.isNavigationBarHidden = false //Show
または
navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show
ナビゲーションバーを非表示にするには:
[self.navigationController setNavigationBarHidden:YES animated:YES];
ナビゲーションバーを表示するには:
[self.navigationController setNavigationBarHidden:NO animated:YES];
ここに非常に迅速でシンプルなソリューションがあります:
self.navigationController.hidesBarsOnTap = YES;
これはダブルタップではなくシングルタップで機能します。また、現在のビューコントローラーをプッシュまたはポップした後でも、ナビゲーションコントローラーの動作を変更します。
単一のビューコントローラーに対してのみ動作を設定する場合は、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
}
ナビゲーションバーの状態を検出したい場合は、それが非表示/表示であるかどうか。あなたは単に次のコードを使用して検出することができます-
if self.navigationController?.isNavigationBarHidden{
print("Show navigation bar")
} else {
print("hide navigation bar")
}
hidesBarsOnTap
UINavigationControllerプロパティでiOS8 SDKでこれを処理するために出てくる
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
}
}