MapKit:自定义标注和添加按钮

时间:2014-04-09 11:07:40

标签: ios uibutton mapkit mkannotation mkannotationview

这让我疯狂!

所以,我有自定义引脚,你可以拖动地图工作正常。因为我希望它们像标准的苹果针(animatesDrop)一样动画,所以我使用以下事件来跟踪最新情况。

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState

当用户拖动一个引脚时,我需要显示一个说出保存/取消的标注。我启动了以下方法,出现了MKPinAnnotationView(是一个UIView),但按钮不起作用。

  • 我尝试在代码中完成所有操作,但没有用。
  • 我试过在视图上捕获触摸事件,但没有用。
  • 我确保视图已保留(selectedPin)
  • 我尝试将视图添加到superview(在帖子上看到)
  • 我已确定userInteractionEnabled已启用
  • 我让视图成为控制器,我很确定它不起作用 任
我有很多糖:(

- (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)框架更大,这会导致其他问题。

2 个答案:

答案 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的后代,则只要用户点击您的视图,地图视图就会调用此方法。您可以使用此方法响应点击并执行与该控件相关的任何操作。