21

ユーザーがビューの 1 つのナビゲーション バーのタイトルをタップしたときに、タッチ時にイベントを発生させたいと考えています。

タッチ イベントを接続するために UINavigationBar のタイトルのビューにアクセスできるかどうか、少し迷っています。

これは可能ですか?

4

9 に答える 9

43

ナビゲーション コントローラーのタイトルを 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 回のタップに使用することも、そのタイトルに必要なジェスチャ認識機能を実装することもできます。

于 2012-05-08T01:00:01.587 に答える
30

私が見つけた解決策はボタンです。次を使用します(ただし、それがどの程度「合法」かはわかりません):

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");
}

コンソールに「タイトルタップ」を記録しました!

これについての私のやり方は完全に間違っているかもしれませんが、何を調べることができるかについてのアイデアを与えるかもしれません. 確かに助かりました!おそらくもっと良い方法があります。

于 2010-01-30T14:19:08.420 に答える
26

他の答えはどれも私にとってうまくいきませんでした。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];
}
于 2012-06-11T23:42:56.637 に答える
9

UINavigationItemクラス参照には、カスタムtitleViewに設定できるプロパティがありますUIView

つまり、UIViewタッチ ハンドラーで のサブクラスを作成し、ナビゲーション アイテムをプッシュするときに、そのアイテムのtitleViewプロパティをサブクラスのインスタンスに設定します。

于 2010-01-16T11:16:24.843 に答える
4

これは、Swift で最もシンプルで簡単なソリューションです。コピーして貼り付け、空白を埋めるだけです。

let navTapGesture = UITapGestureRecognizer(target: <#T##AnyObject?#>, action: <#T##Selector#>)
navigationItem.titleView.userInteractionEnabled = true
navigationItem.titleView.addGestureRecognizer(navTapGesture)

を に設定してくださいuserInteractionEnabledtrueデフォルトtitleViewではオフになっています。

于 2016-09-29T06:39:29.257 に答える
1

可能なオプションの 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;
于 2014-09-04T10:54:17.097 に答える
0

this answerthis 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)
    }
于 2019-03-20T11:22:00.270 に答える