自定义MKAnnotationView触摸区域非常狭窄

时间:2017-09-01 10:13:22

标签: ios mapkit mkannotationview

我的自定义MKAnnotationView子类未设置它的image属性。相反,它处理一些要显示的子视图。

我在委托中实现public func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)来检测注释触摸。

由于触摸区域默认使用image属性计算,因此我的注释视图触摸区域大约为1px。这太荒谬了。

这是我创建它的方式:

init(annotation: JZStreamAnnotation) {
    self.imageView = UIImageView.init(image: <an image>)
    self.imageView.contentMode = .center
    super.init(annotation: annotation, reuseIdentifier: JZStreamAnnotationView.identifier)
    self.canShowCallout = false
    self.imageView.center = CGPoint(x: self.frame.width/2, y: self.frame.height/2)
    self.addSubview(self.imageView)
}

I read this post,但我无法弄清楚hitTest方法是如何工作的。这是一个什么都不做的实现:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if point.x > -100, point.x < 100, point.y > -100, point.y < 100 {
        //return self
        //return self.imageView
        return super.hitTest(point, with: event)
    }
    return .none
}

位于if子句中的breapoint会触发,但返回任何内容(super / self / imageView)都无效。

最后,如果我像这样实现hitTest:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    return .none
}

如果我在我的annotationView确切中心上clic,那么public func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)委托方法如果被触发了!

任何扩大触控区的建议?

1 个答案:

答案 0 :(得分:1)

据我所知,func point(inside:with:)hitTest(point:with:)无法扩大调用代理public func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)

的区域

最后,我最后通过放大MKAnnotationView框架来封闭我的注释子视图,并将锚点移动到我想要我的注释中心的位置

self.frame = CGRect(x: 0, y: 0, width: 
self.myLabel.frame.width, height: self.myLabel.frame.height)
self.centerOffset = CGPoint(x: self.frame.width/2, y: self.myImageView.frame.height/2)

然后我删除了无效的point(inside:with:)hitTest(point:with:)覆盖。

这是我成功使注释视图完全被动的唯一方法。