如何解决优先考虑 MapKit 集群注释接触而不是地图覆盖接触
我的地图有很多注释,我已经使用聚类进行了整理,效果很好。我的地图还使用 didSelectAnnotationView
来检查是否触摸了集群标记,这也很好用。但是,我遇到了一个问题,如果集群标记下方或附近还有地图覆盖,当我选择集群(期望它调用 didSelectAnnotationView
)时,它会检测到地图覆盖被触摸。我有一些问题可能会引导我找到解决方案:
选择集群标记后,将调用以下方法,检查是否触摸了集群标记,然后执行其他操作。正常情况下,当明显接触到集群标记时,这可以正常工作。
- (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 举报,一经查实,本站将立刻删除。