这让我疯狂!
所以,我有自定义引脚,你可以拖动地图工作正常。因为我希望它们像标准的苹果针(animatesDrop)一样动画,所以我使用以下事件来跟踪最新情况。
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState
当用户拖动一个引脚时,我需要显示一个说出保存/取消的标注。我启动了以下方法,出现了MKPinAnnotationView(是一个UIView),但按钮不起作用。
- (void)createYuhuCalloutWithAnnotationView:(MKAnnotationView *)view
{
MapAnnotation *mapAnnotation = (MapAnnotation *)view.annotation;
MapYuhuCallout *calloutView = (MapYuhuCallout *)[[[NSBundle mainBundle] loadNibNamed:@"MapYuhuCallout" owner:self options:nil] objectAtIndex:0];
CGRect calloutViewFrame = calloutView.frame;
calloutViewFrame.origin = CGPointMake(-calloutViewFrame.size.width/2 + 10, -calloutViewFrame.size.height);
calloutView.frame = calloutViewFrame;
[calloutView.saveButton addTarget:self
action:@selector(saveYuhuChanges)
forControlEvents:UIControlEventTouchUpInside];
[calloutView.cancelButton addTarget:self
action:@selector(cancelYuhuChanges)
forControlEvents:UIControlEventTouchUpInside];
calloutView.leftCalloutAccessoryView = calloutView.saveButton;
calloutView.rightCalloutAccessoryView = calloutView.cancelButton;
calloutView.userInteractionEnabled = YES;
view.userInteractionEnabled = YES;
[view addSubview:calloutView];
mapAnnotation.yuhuCalloutView = calloutView;
self.currentCalloutView = calloutView;
self.selectedPin = mapAnnotation;
}
更新
我相信我知道为什么会这样,但我不知道如何解决它。 我正在向AnnotationView(PIN)添加UIView。 UIView比引脚大很多,所以它的框架更大。只有UIView中穿过引脚的部分是可点击的。我期望ClipToBounds隐藏UIView。
所以,似乎我需要在实际的Map中添加一个UIView,这样它就可以点击,或者使AnnotationView(PIN)框架更大,这会导致其他问题。
答案 0 :(得分:3)
我在这里https://stackoverflow.com/a/19404994/1226370对自定义标注视图有很长的解释。在您的情况下,最佳做法是将视图添加为calloutView的子视图,并且calloutView本身不可见。
有关触控处理的所有详细信息均在相关答案中说明。
希望它会有用!
答案 1 :(得分:1)
添加以下Delegate方法,当任何UIControl收到事件时调用该方法:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
NSLog(@"tap event");
}
如果视图是UIControl的后代,则只要用户点击您的视图,地图视图就会调用此方法。您可以使用此方法响应点击并执行与该控件相关的任何操作。