4

3つのビューコントローラーと1つのビューがあります。

1つにはメインビューが含まれ、もう1つにはカスタマイズされたナビゲーションバーが含まれ、3つ目にはビュー(3番目のビューコントローラーのサブビュー)が含まれます。

アプリが読み込まれると、ナビゲーションバービューがサブビューとともに表示されます。サブビュー内には、ナビゲーションバービューの上に配置したいボタンがあります。残念ながら、navigationitem.setrightbutton ...または他のそのようなメソッド(すべてがコード化されており、ペン先はありません)のようなものを使用してこれを簡単に行うことはできません。

だから私がやっていることは私のボタンフレームのy値を負の値に設定することです。これは、ボタンがサブビューのフレーム境界外にあることを意味しますが、ナビゲーションバーの上にボタンを配置するという私が望むものを実現します。

残念ながら、ボタンはサブビューフレームの境界外にあるため、クリックイベントはボタンに渡されません...

ビューのpointinsideとhittestをオーバーライドしようとしましたが、何も機能していません。

私は自分自身を明確にしたと思います。この問題を解決するコードをいただければ幸いです。

4

1 に答える 1

2

タッチ イベントは、ビューの境界内でのみ伝播されます。親の境界の外にサブビューを配置して表示することは可能ですが、イベントはサブビューに渡されません。

イベントを処理するための基本的なメカニズムは、UIView の次のメソッドです。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

このメソッドは、特定のタッチ イベントがどのビューに移動するかを決定します。画面に触れると、ルート ビュー (ウィンドウ) の hitTest メソッドが呼び出され、サブビューのメソッドが呼び出され、サブビューのメソッドが呼び出されます。

原則として、カスタム ウィンドウ クラスを作成し、ウィンドウの hitTest メソッドをオーバーライドして、親の境界の外にある場合でもイベントを強制的にボタンに転送することができますが、これを正しく行うのは非常に面倒です。次のようになります。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGRect rect = WORK_OUT_WHERE_THE_BUTTON_RECT_IS_RELATIVE_TO_THE_WINDOW;
    if (CGRectContainsPoint(rect, point))
    {
        return theButtonView;
    }
    else
    {
        return [super hitTest:point withEvent:event];
    }
}

代わりに、ボタンをナビゲーション バーのサブビューとして配置する代わりに、ナビゲーション バーのサブビューとしてボタンを追加することで、多くの手間を省き、アプリの動作を変更することをお勧めします。

于 2012-09-04T10:40:11.677 に答える