微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优先考虑 MapKit 集群注释接触而不是地图覆盖接触

如何解决优先考虑 MapKit 集群注释接触而不是地图覆盖接触

我的地图有很多注释,我已经使用聚类进行了整理,效果很好。我的地图还使用 didSelectAnnotationView 来检查是否触摸了集群标记,这也很好用。但是,我遇到了一个问题,如果集群标记下方或附近还有地图覆盖,当我选择集群(期望它调用 didSelectAnnotationView)时,它会检测到地图覆盖被触摸。我有一些问题可能会引导我找到解决方案:

  • 如果可能,我可以将地图叠加层添加为集群成员吗?这可能会立即解决我的问题。
  • 如何确定或检查 MKClusterannotation 是否被触及 当附近还有一个叠加层/重叠层也响应触摸时?

选择集群标记后,将调用以下方法,检查是否触摸了集群标记,然后执行其他操作。正常情况下,当明显接触到集群标记时,这可以正常工作。

   - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

   
      if ([[view annotation]  isKindOfClass:[MKClusterannotation class]]) {
        
        [myProjectMapViewController showMapClusterTable: view withClientProject: myProject];
        
      }
      else {
        ...Check for other types
      }
    
   }

选择映射覆盖时调用这些触摸方法。我尝试使用与上述相同的方法检查是否有被触及的集群,但无法找到断点。

-(void) eventStarttouches:(NSSet *) thetouches withEvent:(UIEvent *)event {
/// Note: Don't do anything here.

}

-(void) eventStoptouches:(NSSet *) thetouches withEvent:(UIEvent *)event {

UITouch *touch = [thetouches anyObject];
CGPoint point = [touch locationInView:myMapView];

CLLocationCoordinate2D coord = [myMapView convertPoint:point toCoordinateFromView:myMapView];

MKMapPoint mapPoint = MKMapPointForCoordinate(coord);



for (id potentialoverlay in myMapView.overlays) {
    // Go throw the overlays and test to see if we have a hit.
    
    
  
    if (![potentialoverlay isKindOfClass:[PSMapOverlay class]]) {
        
        continue;
    }
    
    
    
        PSMapOverlay *overlay = (PSMapOverlay*) potentialoverlay;
        id view = [myMapView rendererForOverlay:overlay];
        
        if ([view isKindOfClass:[mkpolygonrenderer class]]) {
            mkpolygonrenderer *polyView = (mkpolygonrenderer*) view;
            
            CGMutablePathRef mpr = CGPathCreateMutable();
            MKpolygon *polygon =((MKpolygon *) polyView.overlay);
            MKMapPoint *polygonPoints = polygon.points;
            for (int p=0; p < polygon.pointCount; p++)
            {
                MKMapPoint mp = polygonPoints[p];
                if (p == 0)
                    CGPathMovetoPoint(mpr,NULL,mp.x,mp.y);
                else
                    CGPathAddLinetoPoint(mpr,mp.y);
            }

            CGPoint mapPointAsCGP = CGPointMake(mapPoint.x,mapPoint.y);
            
            //CGPoint polygonViewPoint = [polyView pointForMapPoint:mapPoint];
           BOOL pointIsInpolygon = CGPathContainsPoint(mpr,mapPointAsCGP,FALSE);
         //   BOOL mapCoordinateIsInpolygon = CGPathContainsPoint(polyView.path,polygonViewPoint,NO);
            CGPathRelease(mpr);
            if (pointIsInpolygon) {
                
                [self _checkOverleyForEdit:overlay];
                break;
            } 
        }
        else if ([view isKindOfClass:[MKpolylineRenderer class]]) {
            
            MKpolylineRenderer *polyView = (MKpolylineRenderer*) view;
            MKMapPoint *mkMultiPoints = polyView.polyline.points;
            NSUInteger pointCount = polyView.polyline.pointCount;
            CGFloat distance;
            for(int i=0;i<pointCount-1;i++) {
                
                CLLocationCoordinate2D lineCoord = MKCoordinateForMapPoint(mkMultiPoints[i]);
                CGPoint segmentpixelPointV = [myMapView convertCoordinate:lineCoord toPointToView:myMapView];
                
                CLLocationCoordinate2D lineCoord2 = MKCoordinateForMapPoint(mkMultiPoints[i+1]);
                CGPoint segmentpixelPointW = [myMapView convertCoordinate:lineCoord2 toPointToView:myMapView];
                
                distance = distancetoSegment(point,segmentpixelPointV,segmentpixelPointW);
                
                if (distance < 20) {
                    [self _checkOverleyForEdit:overlay];
                    
                    break;
                }
            }
        }
    }
}

希望有人能帮忙,谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?