1

現在のウィンドウ上に透明なマスク ビューを作成したいと考えています。これは、タッチ イベントを追跡し、それらを下の表示ビューに渡すだけです。ただし、このマスクに userInteractionEnabled=YES を設定すると、イベントがブロックされ、以下に渡されません。

このビューがイベントをブロックしたり、以下のイベントを手動で渡したりするのを防ぐ方法はありますか?

ありがとう、

4

2 に答える 2

1

最近、自分のアプリの 1 つでこれを行ったところ、非常に簡単であることがわかりました。

UIView をサブクラス化する準備をします。

マスク ビューをキャッチャー ビューと呼びました。プロトコルは次のようになります。

@interface CatcherView : UIView {

    UIView *viewBelow;

}

@property(nonatomic,retain)UIView *viewBelow;

@end

ここでは、UIView をサブクラス化し、以下のビューへの参照を維持しています。

実装では、タッチをビューまたは以下のビューに渡すために、少なくとも 4 つのメソッドを完全に実装する必要があります。メソッドは次のようになります。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Began");
    [self.viewBelow touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Moved");
    [self.viewBelow touchesMoved:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Ended");

    [self.viewBelow touchesEnded:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Cancelled");
    //Not necessary for my app but you just need to forward it to your view bellow.
}

ビューを作成するときは、次のビューを設定することを忘れないでください。背景色をクリアに設定することも非常に重要なので、マスクとして機能します。これはそれがどのように見えるかです:

    CatcherView *catchView=[[CatcherView alloc] initWithFrame:[self.view bounds]];
    catchView.backgroundColor=[UIColor clearColor];
    catchView.viewBelow=myViewBellow;
    [self.view addSubview:catchView];

さらに情報が必要な場合はコメントしてください。

于 2011-02-17T05:49:15.600 に答える
1
  • UIKit は、レスポンダー チェーンに-hitTest:withEvent:メッセージを送信することで、イベントのターゲット ビューを決定します。
  • ターゲットが見つかると、それを処理するレスポンダーが見つかるまで、イベントがレスポンダー チェーンに送信されます (多くの場合、タッチされたビューですが、常にではありません)。

したがって、適切な高さのビューで (おそらくカスタム ウィンドウを使用して) オーバーライドすると、すべての受信イベントを記録し、それらを通常どおりに動作させるために-[NSView hitTest:withEvent:]呼び出すことができます。super

于 2011-02-17T11:05:18.583 に答える