Ios 从MKPolylineView调用?

Ios 从MKPolylineView调用?,ios,mkmapview,mkannotation,mkoverlay,Ios,Mkmapview,Mkannotation,Mkoverlay,当用户触摸MKPolylineView时,是否有任何方法显示标注? 我尝试添加UITapGestureRecognitor,并在选择器中以某个坐标显示标注。但是没有起作用。有什么建议吗 以下是我尝试的方法 - (MKOverlayView *)mapView:(MKMapView *)mapa viewForOverlay:(id <MKOverlay>)overlay self.polylineView = [[MKPolylineView alloc] init

当用户触摸MKPolylineView时,是否有任何方法显示标注? 我尝试添加UITapGestureRecognitor,并在选择器中以某个坐标显示标注。但是没有起作用。有什么建议吗

以下是我尝试的方法

 - (MKOverlayView *)mapView:(MKMapView *)mapa viewForOverlay:(id <MKOverlay>)overlay
        self.polylineView = [[MKPolylineView alloc] initWithPolyline: self.polyline];
        self.polylineView.strokeColor = [UIColor blackColor];
        self.polylineView.lineWidth = 5.0;
        self.polylineView.alpha = 0.7;
        UITapGestureRecognizer *touchOnView = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(addBubble:)];
        [touchOnView setNumberOfTapsRequired:1];
        [touchOnView setNumberOfTouchesRequired:1];
        [self.polylineView addGestureRecognizer:touchOnView];
-(MKOverlayView*)地图视图:(MKMapView*)地图视图用于覆盖:(id)覆盖
self.polylineView=[[MKPolylineView alloc]initWithPolyline:self.polyline];
self.polylineView.strokeColor=[UIColor blackColor];
self.polylineView.lineWidth=5.0;
self.polylineView.alpha=0.7;
UITapGestureRecognizer*touchOnView=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(addBubble:)];
[touchOnView setNumberOfTapsRequired:1];
[touchOnView setNumberOfTouchesRequired:1];
[self.polylineView addgesturecognizer:touchOnView];

非常有趣的问题-我从来没有想过在地图覆盖上放置手势识别器。通过一些实验,我已经验证了在
MKPolylineView
上检测点击是可能的。正如您所发现的,点击手势在地图覆盖上不起作用。因此,我将点击手势放在
MKMapView
上,而不是放在
MKPolylineView
上。然后处理水龙头:

- (void)handleTapGesture:(UIGestureRecognizer*)gestureRecognizer
{
    if (measureLine != nil)
    {
        UIView* hitView = [self.polylineView hitTest:[gestureRecognizer locationInView:self.polylineView] withEvent:nil];
    }
}
如果点击在
MKPolylineView
之外,则点击视图将为零;如果点击在里面,则点击视图将为
self.polylineView

然而,这可能并不像您希望的那样。对于水平线和垂直线,它可以完美地工作,因为基础视图的大小与线的大小大致相同。但对于45度线,基础视图必须比线大得多,因为它是轴对齐的边界框(AABB)。如果你考虑一条45度的线,只使用水平线和垂直线将其围起来,你会得到一个很大的区域——比你想要检测到的要大得多

e、 g

但是使用点击手势或点击测试总是会导致识别这些AABB内的点击。因此,无论您尝试将手势附加到何处—例如,在尝试时附加到
MKPolylineView
,或附加到
MKMapView
,都会得到虚假的结果。对于较长的线,问题会变得更严重-如果您想象一条线从地图视图的右上角到左下角,则需要将其括起来的AABB将覆盖地图视图的整个区域,这意味着左上角或右下角的点击将被解释为击中了
MKPolylineView

为了解决这个问题,我建议采用以下方法:

  • 在地图视图上使用轻触手势识别器
  • 在处理抽头的方法中:
    • 将屏幕点击位置转换为地图坐标
    • 循环通过每个多段线(除非只有1条)
    • 对于多段线中的每个点,取将该点连接到下一点的线段,然后计算地图坐标距该线的距离。使用三角学来计算。
      • 如果距离非常接近此线段,则停止检查其余线段,并处理您希望显示的任何标注等
      • 如果距离不近,则移动到下一个点以及将其连接到下一个但只有一个点的线段
无论多段线的长度或角度如何,这种方法都可以保证有效。不存在AABB问题。缺点是,所有这些距离计算可能在计算上都很昂贵-因此,如果您的多段线由大量点组成,或者如果您有大量多段线,那么您可能无法在不阻止UI响应的情况下完成所有这些计算,这意味着您需要将其移动到背景线程中。如果您只有少数多段线,并且/或者它们由几个点组成,那么您就可以了

--------
|    / |
|   /  |
|  /   |
| /    |
|/     |
--------