現在のウィンドウ上に透明なマスク ビューを作成したいと考えています。これは、タッチ イベントを追跡し、それらを下の表示ビューに渡すだけです。ただし、このマスクに userInteractionEnabled=YES を設定すると、イベントがブロックされ、以下に渡されません。
このビューがイベントをブロックしたり、以下のイベントを手動で渡したりするのを防ぐ方法はありますか?
ありがとう、
現在のウィンドウ上に透明なマスク ビューを作成したいと考えています。これは、タッチ イベントを追跡し、それらを下の表示ビューに渡すだけです。ただし、このマスクに userInteractionEnabled=YES を設定すると、イベントがブロックされ、以下に渡されません。
このビューがイベントをブロックしたり、以下のイベントを手動で渡したりするのを防ぐ方法はありますか?
ありがとう、
最近、自分のアプリの 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];
さらに情報が必要な場合はコメントしてください。
-hitTest:withEvent:
メッセージを送信することで、イベントのターゲット ビューを決定します。したがって、適切な高さのビューで (おそらくカスタム ウィンドウを使用して) オーバーライドすると、すべての受信イベントを記録し、それらを通常どおりに動作させるために-[NSView hitTest:withEvent:]
呼び出すことができます。super