首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测tap是在自定义calloutView内部还是外部

检测tap是在自定义calloutView内部还是外部
EN

Stack Overflow用户
提问于 2020-04-03 17:08:48
回答 1查看 88关注 0票数 0

我有一张带大头针的地图。当我点击管脚时,自定义标注显示为UIView。当我在calloutView内部点击时,应该没有任何反应。如果我在视图外部点击,自定义calloutView应该会消失。但我不知道如何实现它,要么它在视图内外轻敲就会消失,要么根本不会消失。

我处理攻丝的方法:

代码语言:javascript
复制
    func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    if view == customCallout {
        return
    } else {
        customCallout?.removeFromSuperview()
    }
}

在这种情况下,它将在两次点击上删除自定义标注。在这里我创建了标注:

代码语言:javascript
复制
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    if view.annotation is MKUserLocation {
        return
    }
    //this creates the callout
    let views = Bundle.main.loadNibNamed("CustomCalloutView", owner: nil, options: nil)
    let calloutView =  views?[0] as! CustomCalloutView
    calloutView.delegate = self
    customCallout = calloutView
}

如果我在自定义标注视图内点击,它不会消失,但在我点击外部的情况下,它确实会消失,我如何实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2020-04-07 14:03:22

旧的Location and Maps Programming Guide概述了这一过程。该技术涉及为注释视图实现一个hitTest方法,该方法在自定义标注中包含命中。否则,触摸不会被识别为注释视图和/或标注的一部分,而是在地图上。

正如Guide所说:

当您使用自定义视图而不是标准详图索引时,您需要做额外的工作,以确保在用户与其交互时,您的详图索引适当地显示和隐藏。以下步骤概述了创建包含按钮的自定义标注的过程:

  1. 设计表示自定义标注的NSView或UIView子类。子类可能需要实现drawRect:方法来绘制自定义动画视图控制器,该控制器初始化标注视图并执行与按钮相关的操作。
  2. 在注释视图中,实现hitTest:以响应注释视图边界之外但在标注视图边界内的点击,如清单6-7所示。在注释视图中,实现
  3. :动画:当用户单击或点击时,将标注视图添加为注释视图的子视图。如果在用户选择注解视图时该注解视图已经可见,则setSelected:方法应从注解视图中删除注解子视图(请参见清单6-8)。
  4. 在注解视图的initWithAnnotation:方法中,将canShowCallout属性设置为NO,以防止用户选择annotation.
  5. Listing时地图显示标准注解6-7显示了一个实现hitTest:的示例,用于处理注解视图中可能超出注解视图边界的命中。

清单6-7响应自定义标注中的命中

  • (NSView *)hitTest:( NSPoint )point { NSView *hitView = super :point;if (hitView == nil && self.selected) { NSView *calloutView = self.calloutViewController.view;NSPoint pointInCalloutView = self convertPoint:point toView: calloutView;hitView =calloutView hitTest:pointInCalloutView;} return hitView;}

清单6-8显示了一个实现setSelected:animated:的示例,以便在用户选择注释视图时动画显示自定义标注视图的到达和取消。

清单6-8添加和删除自定义标注view

  • (void)setSelected:(BOOL)selected { setSelected:selected;//获取自定义标注视图。NSView *calloutView = self.calloutViewController.view;if (selected) { NSRect annotationViewBounds = self.bounds;NSRect calloutViewFrame = calloutView.frame;//标注视图位于注释视图的右上方。calloutViewFrame.origin.x = -(NSWidth(calloutViewFrame) - NSWidth(annotationViewBounds)) * 0.5;calloutViewFrame.origin.y = -NSHeight(calloutViewFrame) + 15.0;calloutView.frame = calloutViewFrame;self addSubview:calloutView;} else { calloutView.animator removeFromSuperview;} }

现在,上面的显然是Objective-C (清单6-8的实现可能与他们的不同),但基本模式在Swift中是相同的。请参阅此Swift Github存储库,其中演示了如何在CustomMapViewAnnotationCalloutSwift中实现自定义注释视图(包括所需的hitTest行为)。因此,它结合了在注释视图中实现hitTest,以及明显地让callout使用这些接触。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61008497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档