我已经搜索并尝试了各种解决方案,下面的代码是我到目前为止所提出的。我尝试了很多提示代码不整洁,但我希望我已经删除了大部分内容。
我有一个自定义注释,其横幅超出了注释本身的范围。我想回应横幅上的点击。
使用下面的代码,当我点击横幅时,我得到了这个输出:
AV returning hit view: <UILabel: 0x7fd70bd8f4e0; frame = (0 -10; 77 12); text = 'Coffee Republic'; layer = <_UILabelLayer: 0x60000008e920>> as <GJ3.AnnotationView: 0x7fd70f3035e0; frame = (112 349.5; 0 0); layer = <CALayer: 0x618000a37ac0>>
我还设置了返回点击视图的代码!.superview!并且上面的日志显示将返回注释。
当我单击注释区域本身时,我得到了我期望的标注。单击横幅不会产生任何响应。我注意到当我点击实际的注释区域时,日志只会显示&#39; nil&#39;回来,我不明白为什么会有效!
我的具体问题是,我从hitTest发送的返回是否正确,是否有效?如果是的话,有什么可能阻止它呢?
class AnnotationView: MKAnnotationView {
var companyName: String!
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let hitView = super.hitTest(point, with: event)
if (hitView != nil) {
self.superview?.bringSubview(toFront: self)
}
if (hitView != nil) {
print ("AV returning hit view: \(hitView!) as \(hitView!.superview!)")
return hitView!
} else {
print ("AV returning hit view: nil")
return nil
}
}
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let rect = self.bounds
var isInside = rect.contains(point)
if(!isInside) {
for view in self.subviews as [UIView] {
print ("AV view: \(view)")
if !view.isHidden && view.alpha > 0 && view.isUserInteractionEnabled && view.point(inside: convert(point, to: view), with: event) {
print ("hit in \(view)")
isInside = true
return isInside
}
}
}
return isInside
}
}
答案 0 :(得分:0)
我建议不要修改hitTest,而是增加注释本身的大小(将注释拆分为容器视图,将横幅拆分为另一个视图,然后在主MKAnnotationView中滑入)。像这样修改响应者链可能会在未来的OS版本中导致一些不良行为。
我建议您阅读应答器链,了解最新情况,如果您仍然想要朝这个方向发展(最近发表的一篇好文章:https://medium.com/bpxl-craft/event-delivery-on-ios-part-1-8e68b3a3f423#.og2cpaeb0)。