3

我有一个习惯MKAnnotationView。在它的setselected:animated方法中,我添加了一个从笔尖加载的自定义气泡,调整注释视图的框架以包含此视图并用其他颜色重新绘制注释圆圈,如下所示(第一个 - 未选中,第二个 - 选中,蓝色框架,绿色 - alpha = 0.8 的自定义气泡视图,红色 - 注释视图):

在此处输入图像描述

它工作正常,出现气泡,并且只能通过在其外部点击来“关闭”(这就是我增加框架的原因)。我在这个气泡上有一些按钮,如果注释下只有地图没有任何内容,它们是可点击的。

但是,当标注气泡下方有另一个注释时,我可以单击“通过”整个气泡。当我点击其中一个按钮时,点击突出显示出现,但另一个注释被选中,因为didSelectAnnotationView触发......

我试图使气泡不透明/半透明,没有运气;在按钮上设置 ExclusiveTouch,在视图本身上,没有运气;尽量不要乱帧,还是可以点进去的。我错过了什么吗?

谢谢

编辑更短:如果此 UIView 下有其他 MKAnnotationView,为什么我可以单击 MKAnnotationView 中的UIView添加项?addSubview

细节 :

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
  if(selected)
  {
    initialFrame = self.frame;       // save frame and offset to restore when deselected
    initialOffset = self.centerOffset;  // frame is correct for a circle, like {{2.35, 1.47}, {12, 12}}

    if (!self.customCallout) 
    {
      self.customCallout = [[[NSBundle mainBundle] loadNibNamed:@"CustomCallout" owner:self options:nil] objectAtIndex:0];
    }
    // adjust annotationview's frame and center
    // callout is 200x120, here frame is {{2.35, 1.47}, {200, 132}} 
    self.customCallout.layer.cornerRadius=5;
    self.customCallout.exclusiveTouch = YES;
    [self addSubview:self.customCallout];
  }
...
}

initWithAnnotation有这些:

   self.canShowCallout = NO;  // to appear the subview
   self.exclusiveTouch = YES; // ...
   self.enabled = YES;
   self.opaque = YES;
4

4 回答 4

3

触摸处理方法(touchesBegan:touchesEnded:等)的默认行为在文档中有此注释:

此方法的默认实现什么也不做。然而,UIResponder 的直接 UIKit 子类,尤其是 UIView,将消息转发到响应者链。

MKAnnotationView 是 UIVIew 的子类。结果,当您的注释被触摸时,它会将其传递给它的超类并在响应者链上,因此最终您的地图视图会得到触摸并激活被覆盖的注释。

要解决此问题,请在 annotationView 类中实现触摸处理方法,并且不要将触摸事件向上传递到响应者链。

于 2012-05-01T20:05:14.840 回答
0

你能检查一下哪个事件先触发吗

1, the button on bubble
2, didSelectAnnotationView

如果气泡上的按钮首先触发,您可以通过子类化气泡中的触摸相交

touchesBegan:touches
touchesMove:touches
touchesEnd:touches

在气泡视图中以防止传播

于 2012-04-28T10:20:02.123 回答
0

我想您会发现以下链接非常有用:

http://blog.asynchrony.com/2010/09/building-custom-map-annotation-callouts-part-2/

如何使 MKAnnotationView 触摸敏感?

第一个链接讨论(除其他外)如何防止传播,第二个链接如何检测触摸。

于 2013-11-27T16:16:33.333 回答
0

我最近遇到了这个问题,花了很多我没有的时间。解决它,实际上很简单,当然是花了很多年才意识到的。

您只需要将 MapView 子类化,并在该子类中包含以下内容:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    debugPrint(gestureRecognizer)
    if gestureRecognizer is UITapGestureRecognizer {
        return true
    } else {
    return false
    }
}

原因是,地图交互的所有处理,例如缩放平移等,似乎都是在内部处理的,我们无法访问。然而,引起我们问题的手势是可以访问的,但就我而言,我只想要处理选择和取消选择注释的点击手势。

于 2018-05-01T12:29:28.367 回答