自定义 MKAnnotationView 触摸区域窄得离谱
Custom MKAnnotationView touch zone is ridiculously narrow
我的自定义 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
子句中的断点触发,但返回任何内容 (super
/ self
/ imageView
) 什么都不做。
最后,如果我像这样实现 hitTest:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
return .none
}
如果我点击我的 annotationView 精确中心,public func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
委托方法被触发!
有什么扩大触摸区的建议吗?
据我了解,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:)
没有任何作用的覆盖。
这是我成功使注释视图完全响应的唯一方法。
我的自定义 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
子句中的断点触发,但返回任何内容 (super
/ self
/ imageView
) 什么都不做。
最后,如果我像这样实现 hitTest:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
return .none
}
如果我点击我的 annotationView 精确中心,public func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
委托方法被触发!
有什么扩大触摸区的建议吗?
据我了解,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:)
没有任何作用的覆盖。
这是我成功使注释视图完全响应的唯一方法。