【问题标题】:MapKit : Custom callouts and adding buttonsMapKit:自定义标注和添加按钮
【发布时间】:2014-04-09 11:07:39
【问题描述】:

这让我发疯了!

所以,我有自定义图钉,您可以在地图上拖动它们,效果很好。因为我希望它们像标准的苹果针 (animatesDrop) 一样进行动画处理,所以我使用以下事件来跟踪正在发生的事情。

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

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

  • 我已经尝试在代码中完成这一切,但没有成功。
  • 我尝试在视图上捕获触摸事件,但没有成功。
  • 我已确保保留视图 (selectedPin)
  • 我已尝试将视图添加到超级视图(在帖子上看到)
  • 我已确定 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;
}

更新

我相信我知道为什么会这样,但我不确定如何解决它。 我正在将 UIView 添加到 AnnotationView (PIN)。 UIView 比 pin 大很多,所以它的框架更大。只有穿过图钉的 UIView 部分是可点击的。我希望 ClipToBounds 隐藏 UIView。

所以,我似乎需要在实际地图中添加一个 UIView 以便它可以点击或使 AnnotationView (PIN) 框架更大,这会导致其他问题。

【问题讨论】:

  • MKAnnotationView 是您的自定义类继承的抽象类,您是否重写了 leftCalloutAccessoryView 方法并使用它返回视图?
  • 你有榜样吗?我认为我不需要覆盖课堂上的任何内容
  • 对不起不是atm,你能描述一下按钮不起作用的意思吗?你的意思是 addTarget 不火?还是按钮不显示?
  • addTarget 未触发,未检测到触摸检测,是因为它作为子视图添加到图钉而不是地图?

标签: ios uibutton mapkit mkannotation mkannotationview


【解决方案1】:

我在这里https://stackoverflow.com/a/19404994/1226370 对自定义标注视图有很长的解释。在您的情况下,最佳做法是将视图添加为 calloutView 的子视图,并且 calloutView 本身不可见。

有关触摸处理的所有详细信息都在链接答案中进行了描述。

希望对你有用!

【讨论】:

  • 我浏览了一下,认为这会解决它,但遗憾的是它没有,不过感谢您的帮助。我认为我的按钮在注释视图之外,因此没有收到触摸
  • 即使您的按钮在注释视图绑定内,它们仍然会忽略任何触摸输入,因为 mapView 处理触摸的方式不同(搜索最接近触摸位置的引脚),因此不会发生任何触摸事件被发送到注释子视图。无论如何,您都需要继承 MKAnnotationView 并实现 onHit 方法,即使您在其他方面有问题,您仍然会遇到这个问题。
  • 我认为您实际上是对的,我认为视图被添加到针脚视图中,这太小了,因此与针脚重叠的视图的任何部分都是可点击的,但框架之外的任何内容都不会
  • 感觉需要加到地图上
【解决方案2】:

添加以下在任何 UIControl 接收到事件时调用的 Delegate 方法:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
        NSLog(@"tap event");
    }

如果视图是 UIControl 的后代,则地图视图会在用户点击您的视图时方便地调用此方法。您可以使用此方法响应点击并执行与该控件相关的任何操作。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多