gpt4 book ai didi

ios - 来自 MKPolylineView 的标注?

转载 作者:可可西里 更新时间:2023-11-01 05:15:06 25 4
gpt4 key购买 nike

有什么方法可以在有人触摸 MKPolylineView 时显示标注?我尝试添加 UITapGestureRecognizer 并在选择器中以某个坐标显示标注。但没有用。有什么建议吗?

以下是我尝试过的方法

 - (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];

最佳答案

非常有趣的问题 - 我从来没有想过将手势识别器放在 map 叠加层上。通过一些实验,我验证了可以检测到 MKPolylineView 上的点击。正如您发现的那样,点击手势在 map 叠加层上不起作用。因此,我将点击手势放在 MKMapView 而不是 MKPolylineView 上。然后处理水龙头:

- (void)handleTapGesture:(UIGestureRecognizer*)gestureRecognizer
{
if (measureLine != nil)
{
UIView* hitView = [self.polylineView hitTest:[gestureRecognizer locationInView:self.polylineView] withEvent:nil];
}
}

hitView 如果您的点击在 MKPolylineView 之外,则为 nil,如果点击在里面,则为 self.polylineView

但是,这可能不会如您所愿。对于水平和垂直线,它工作得很好,因为底层 View 的大小与线的大小大致相同。但是对于 45 度线,底层 View 必须比线大得多,因为它是轴对齐的边界框 (AABB)。如果您考虑一条 45 度线,仅使用水平线和垂直线包围它,您最终会得到一个很大的区域 - 比您想要检测的水龙头大得多。

例如

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

但是使用点击手势或 HitTest 总是会导致识别这些 AABB 内的点击。因此,无论您尝试在何处附加手势 - 例如到 MKPolylineView,或者到 MKMapView,你会得到虚假的结果。对于较长的线,问题会变得更糟 - 如果您想象一条线从 map View 的右上角延伸到左下角,那么您需要包围它的 AABB 将覆盖 map View 的整个区域,这意味着点击左上角或右下角将被解释为点击 MKPolylineView

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

  • 在 map View 上使用点击手势识别器
  • 在您处理点击的方法中:
    • 将屏幕点击位置转换为 map 坐标
    • 遍历每条多段线(除非你只有 1 条)
    • 对于多段线中的每个点,取将该点连接到下一个点的线段,并计算您的 map 坐标与这条线的距离。使用三角函数来计算这个。
      • 如果距离非常接近该段,则停止检查其余段并处理您想显示的任何标注等
      • 如果距离不近,则移动到下一个点和将它连接到下一个点的线段

无论多段线的长度或它们的角度如何,这种方法都能保证有效。没有 AABB 问题。缺点是所有这些距离计算的计算量可能很大——因此,如果您的多段线由大量点组成,或者如果您有大量多段线,那么您可能无法完成所有这些计算不会阻止 UI 响应,这意味着您需要将其移至后台线程。如果您只有几条折线,和/或它们由几个点组成,那么您会没事的。

关于ios - 来自 MKPolylineView 的标注?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9931566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com