我的自定义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)
委托方法如果被触发了!
任何扩大触控区的建议?
答案 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:)
覆盖。
这是我成功使注释视图完全被动的唯一方法。