ユーザーがビューの 1 つのナビゲーション バーのタイトルをタップしたときに、タッチ時にイベントを発生させたいと考えています。
タッチ イベントを接続するために UINavigationBar のタイトルのビューにアクセスできるかどうか、少し迷っています。
これは可能ですか?
ユーザーがビューの 1 つのナビゲーション バーのタイトルをタップしたときに、タッチ時にイベントを発生させたいと考えています。
タッチ イベントを接続するために UINavigationBar のタイトルのビューにアクセスできるかどうか、少し迷っています。
これは可能ですか?
ナビゲーション コントローラーのタイトルを 1 回タップするジェスチャ レコグナイザーを追加できます。navigationBar サブビューでは、タイトルはインデックス 1、左ボタンのインデックスは 0、右ボタンのインデックスは 2 であることがわかりました。
UITapGestureRecognizer *navSingleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(navSingleTap)];
navSingleTap.numberOfTapsRequired = 1;
[[self.navigationController.navigationBar.subviews objectAtIndex:1] setUserInteractionEnabled:YES];
[[self.navigationController.navigationBar.subviews objectAtIndex:1] addGestureRecognizer:navSingleTap];
次に、実装のどこかに次を実装します。
-(void)navSingleTap
したがって、これを 1 回のタップに使用することも、そのタイトルに必要なジェスチャ認識機能を実装することもできます。
私が見つけた解決策はボタンです。次を使用します(ただし、それがどの程度「合法」かはわかりません):
UIButton *titleLabelButton = [UIButton buttonWithType:UIButtonTypeCustom];
[titleLabelButton setTitle:@"myTitle" forState:UIControlStateNormal];
titleLabelButton.frame = CGRectMake(0, 0, 70, 44);
titleLabelButton.font = [UIFont boldSystemFontOfSize:16];
[titleLabelButton addTarget:self action:@selector(didTapTitleView:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.titleView = titleLabelButton;
タイトルを設定した場所にそのコードを配置します。次に、他の場所でこれをテストしました:
- (IBAction)didTapTitleView:(id) sender
{
NSLog(@"Title tap");
}
コンソールに「タイトルタップ」を記録しました!
これについての私のやり方は完全に間違っているかもしれませんが、何を調べることができるかについてのアイデアを与えるかもしれません. 確かに助かりました!おそらくもっと良い方法があります。
他の答えはどれも私にとってうまくいきませんでした。navigationBar の既存のサブビューにジェスチャを追加したり、titleView を置き換えたりするのではなく、navigationBar のかなりの部分をカバーする明確な UIView を追加しただけです...
- (void) setupNavbarGestureRecognizer {
// recognise taps on navigation bar to hide
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showHideNavbar)];
gestureRecognizer.numberOfTapsRequired = 1;
// create a view which covers most of the tap bar to
// manage the gestures - if we use the navigation bar
// it interferes with the nav buttons
CGRect frame = CGRectMake(self.view.frame.size.width/4, 0, self.view.frame.size.width/2, 44);
UIView *navBarTapView = [[UIView alloc] initWithFrame:frame];
[self.navigationController.navigationBar addSubview:navBarTapView];
navBarTapView.backgroundColor = [UIColor clearColor];
[navBarTapView setUserInteractionEnabled:YES];
[navBarTapView addGestureRecognizer:gestureRecognizer];
}
UINavigationItem
クラス参照には、カスタムtitleView
に設定できるプロパティがありますUIView
。
つまり、UIView
タッチ ハンドラーで のサブクラスを作成し、ナビゲーション アイテムをプッシュするときに、そのアイテムのtitleView
プロパティをサブクラスのインスタンスに設定します。
これは、Swift で最もシンプルで簡単なソリューションです。コピーして貼り付け、空白を埋めるだけです。
let navTapGesture = UITapGestureRecognizer(target: <#T##AnyObject?#>, action: <#T##Selector#>)
navigationItem.titleView.userInteractionEnabled = true
navigationItem.titleView.addGestureRecognizer(navTapGesture)
を に設定してくださいuserInteractionEnabled
。true
デフォルトtitleView
ではオフになっています。
可能なオプションの 1 つ: (UILabel を使用)
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSomething:)];
UILabel * titleView = [UILabel new];
titleView.text = @"Test";
[titleView sizeToFit];
titleView.userInteractionEnabled = YES;
[titleView addGestureRecognizer:tapGesture];
self.navigationItem.titleView = titleView;
this answerとthis oneに基づいて、私は以下の「機能的な」アプローチを採用しました。それがもう読めるかどうかはわかりませんが、ループから抜け出すよりも好きです。
if let navTitle = self.navigationController?.navigationBar.subviews.first(where: {$0.subviews.first is UILabel}) {
let gesture = UITapGestureRecognizer(target: self, action: action)
gesture.numberOfTapsRequired = numberOfTapsRequired
navTitle.isUserInteractionEnabled = true
navTitle.addGestureRecognizer(gesture)
}