サブビューを MKMapView またはその子孫ビューのいずれかに追加すると、タッチはすぐに通過してマップに影響を与えます。
この質問は、ビューを注釈ビューに追加するカスタム コールアウトで修正されたバグを説明するために最終的に使用されます。吹き出しに触れたときに吹き出しを閉じることはできません。この質問はそれに関連しています。しかし、ケースを簡潔にするために、問題を示す小さな例を使用します。
exclusiveTouch と userInteractionEnabled を設定しても何も起こりません。ところで。
UIView を取り、それを mapView にアタッチしましょう
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]
view.backgroundColor = [UIColor blackColor];
[mapView addSubview:view];
マップにもジェスチャを追加しましょう
[mapView addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]];
そして、handleLongPressに何かを印刷させるだけです NSLog(@"longpress"); ここでプログラムを実行し、黒い uiview をどれくらい長く押すと longPress がトリガーされるかを観察します。吹き出しを表示する注釈を追加して選択すると、黒い uiview に触れると閉じます。注釈が黒い uiview の下になるようにマップをスクロールすると、注釈を選択できるようになります。これが私の解決策です。mapview に追加するビューに SOME_TAG でタグを付け、MKMapView の hitTest メソッドを上書きします
@interface MKMapView(HackySolution)
@end
@implementation MKMapView(HackySolution)
- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
// block touch propagation
if(view.tag == SOME_TAG){
view = nil;
}
return view;
}
@end
これで取引が完了しました。問題は解決したかもしれませんが、UIView からのタッチがマップにそのまま渡される理由が本当にわかりません。サブビューへのタッチがそのparentViewに渡されるのは意味がありません。タッチの仕組みを理解していないのかもしれません。つまり、通常の UIView にボタンを配置し、その上に別の uiview を配置して完全に覆い隠すと、ボタンが正しく表示されないのでしょうか? 私は自分自身を推測し始めています。:/
MKMapView がこれを行うように配線されているとしか推測できませんが、よくわかりません。MKMapView 内のどこかにスクロール ビューがあると思いましたが、すべてのサブビューとすべての子孫を調べましたが、何も見つかりませんでした。
この問題を解決するためのより良い方法はありますか、それともこれが最善ですか?
状況についての洞察をいただければ幸いです。