自定义MKAnnotationView – 如何捕获触摸而不是忽略标注?

我有一个自定义的MKAnnotationView子类。 它正如我所希望的那样显示视图。 在那个视图中,我有一个按钮。 我想捕获按钮上的事件以执行操作。 这很好用。

但是,我不希望标注被解雇或消失。 基本上,触摸标注中的按钮将开始播放声音,但我想保留注释,以便用户可以按下停止,而无需再次触摸地图图钉以重新注释注释。 在另一个例子中,我希望按钮触摸可以在标注中设置更多细节动画,因此我绝对不想在此时关闭标注。

当用户选择标注或标注内的按钮时,如何防止标注消失?

这可能不是最好的解决方案,但绝对有效。 首先,我尝试了很多东西,比如观察上下文等,但我从来没有过去崩溃,而且看起来很麻烦。 所以,这就是我做的:

我首先指定了保持警报可见性的控制因素。 在我的例子中,我创建了一个自定义注释视图,每当用户单击该自定义视图上的按钮时,我希望它保持可见,甚至可能更改内容。 因此,我在该自定义视图上设置了一个委托,以便我的地图可以知道什么时候发生了变化。 在我的地图视图控制器中,我捕获该消息并将类成员变量设置为true以表示我希望注释视图保留。

注意:这将在选择消息发生之前发生。

现在,在我的didDeselectAnnotation方法中,我检查了布尔值。 如果我想保持它可见,我选择不删除我的注释,我重置布尔值,我手动重新选择注释 ,将动画设置为NO。 这使得注释视图“保持”可见 – 可能是作弊,但用户无法看到差异。 每当该布尔值表示取消选择正常时,我只需删除注释,一切都很好。

所以,工作流程如下:

  1. 触针
  2. 显示CustomAnnotationView
  3. 用户单击CustomAnnotationView上的按钮,该按钮通知委托(mapView)该操作发生
  4. 设置类布尔值以了解您要保留注释
  5. 然后mapView调用didDeselectAnnotation方法
  6. 在didDeselectAnnotation方法中,使用条件来决定是否应该删除注释,或者通过不删除注释并在没有动画的情况下手动重新选择它来保持它。

我希望这有助于其他人。 我花了一段时间来解决这个问题,所以我希望它可以节省你的时间。

如果您找到更好的解决方案,请务必在此发布!

您可以使用hittest来抑制标注关闭,请查看以下post。 检测点击标注的标题