36

うまくいけば、誰かが私を助けてくれることを願っています-ネットで答えを探しましたが、見つけられません-

UINavigationBar に追加された UIBarButtonItems には、必要以上に大きなクリック領域があります。明らかにボタンをクリックしなかった場合-

これも試してください-ナビゲーションバーの下、ボタンの下、ボタンをクリックすると、ナビゲーションバーの下に約5ピクセル以上クリックされます-

私の問題はこれです-

ボタン付きのカスタム ヘッダーをテーブルビューに追加しましたが、ヘッダーのボタンをクリックすると、テーブルビュー ヘッダーのボタンの代わりに UINavigationBar ボタンがこれらの 5+ ピクセルに対してトリガーされます-

私はテストを行い、UINavigationBar からボタンを削除しました。興味深いのは、ナビゲーション バーの下の 5 ピクセルでは、ナビゲーション バーにボタンがなくても、ヘッダーのボタンがトリガーされないことです。

そのほとんどは、ナビゲーション バーがクリック スペースとしてその下に 5 ピクセル以上を確保しているようなものです。

私の質問はこれです-

ナビゲーション バーがボタンの余分な 5+ ピクセルを取得しないようにする方法を教えてもらえますか?

どうもありがとう ;)

4

8 に答える 8

3

100% 確実ではありませんが、UITouch クラスを介してタッチの位置を取得できますか?

UIBarButtonItem は UIResponder を拡張しませんが、UINavigationBar は拡張します!

したがって、UINavigationBar をサブクラス化し、このサブクラスをアプリで使用すると、タッチの座標をキャッチして、それらが問題ないかどうかを確認してから、ナビゲーション バー アクションまたはボタン アクションのいずれかを適用することを決定できます (カスタム リダイレクトによる)。 .

于 2011-02-16T17:13:47.543 に答える
1

UINavigation Barのパディングを回避しようとすると、アプリストアに送信するときに問題が発生する可能性があります。カスタム見出しにパディングを追加する方が簡単です。「太った親指」として、私はHIGに感謝することを学びました。

于 2011-02-23T17:49:55.560 に答える
1

かなり古い質問ですが、解決策が他の人にも役立つかもしれません...

' hitTest:withEvent: 'という 1 つのメソッドだけをオーバーライドするUINavigationBar サブクラスを作成しました。hitTest:withEventが呼び出されると、イベントがナビゲーション バーのフレーム内 (pointInside:withEvent:) で発生したかどうかがチェックされます。イベントが外部で発生した場合、userInteractionEnabledフラグがNOに設定されるため、イベントはナビゲーション バーとそのサブビューによって無視されます。

私の場合、ナビゲーション バーのサブクラスは IB 経由で挿入されますが、もちろん「UINavigationController initWithNavigationBarClass:toolbarClass:」経由で挿入することも可能です。

ヘッダ:

@interface MMMasterNavigationBar : UINavigationBar

@end

実装:

@implementation MMMasterNavigationBar

/*
 hitTest:withEvent:

 The hit area in for navigation bar button items is enlarged by default.
 Other objects directly below the navigation bar doesn't receive tap events.
 We avoid the default enlarging of the tappable area by disabling userInteraction
 when the real tap is outside the navigation bar.

 */
-(UIView *)hitTest:(CGPoint)pPoint
         withEvent:(UIEvent *)pEvent {
    //FLog;

    if ([self pointInside:pPoint
                withEvent:pEvent]) {
        //NSLog(@"User interaction enabled");
        self.userInteractionEnabled = YES;

    } else {
        //NSLog(@"User interaction disabled");
        self.userInteractionEnabled = NO;
    }

    return [super hitTest:pPoint
                withEvent:pEvent];
}

@end
于 2016-05-22T17:14:57.640 に答える
1

私の知る限り、オフにすることは不可能です。ナビゲーション バーに他のボタンがある場合、これらのクリック スペースは衝突しませんが、ナビゲーション バーのすぐ下にボタンがあり、間にスペースがまったくない場合は、うまくいきません。解決策として、ヘッダーとそのボタンの小さなパディングを検討してください。

于 2011-02-16T14:27:47.137 に答える
0

これはストーリーボードから直接行うことができます。UIView を各ナビゲーション アイテムにドラッグし、その背景を clearColor に設定し、サイズを変更します。ボタンを各 UIView にドラッグし、サイズを合わせます。

于 2014-09-18T15:11:00.823 に答える
0
    var buttonContainer:UIView = UIView()
    buttonContainer.frame = CGRectMake(0, 0, 32, 32)

    var imagess:UIImage = UIImage(named: "noti@2x.png")!

    var closeButton:UIButton = UIButton()
    closeButton.setImage(imagess, forState: UIControlState.Normal)
    closeButton.frame = CGRectMake(10, 5, 20, 20)
    closeButton.contentMode = UIViewContentMode.Center
    closeButton.titleEdgeInsets = UIEdgeInsetsMake(20, 0, 0, 0)

    buttonContainer.addSubview(closeButton)

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: buttonContainer)
于 2015-07-18T17:45:19.870 に答える