即使覆盖的 hittest 返回正确的值,注释也不会响应命中

Annotation not responding to hit even though overridden hittest is returning correct value

我已经搜索并尝试了各种解决方案,下面的代码是我到目前为止所想出的。我已经尝试了很多技巧代码不整洁,但我希望我已经去掉了大部分。

我有一个自定义注释,其中的横幅超出了注释本身的范围。我想回应横幅上的点击。

使用下面的代码,当我点击横幅时我得到这个输出:

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>>

我也设置了代码return hit view!.superview!上面的日志显示 return 注释。

当我单击注释区域本身时,我得到了预期的标注。单击横幅没有任何响应。我确实注意到当我点击实际的注释区域时,日志只显示 'nil' returns,我不明白为什么会这样!

我的具体问题是,我从 hitTest 发送的 return 是否正确,应该有效吗?如果是,是什么阻止了它?

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
}

}

我建议不要修改 hitTest,而是增加注释本身的大小(将注释拆分到容器视图中,将横幅拆分到另一个视图中,该视图在之后滑入但仍在主 MKAnnotationView 中)。像这样修改响应者链可能会在未来的 OS 版本中导致一些不良行为。

如果您仍想朝那个方向前进,我建议您阅读响应者链以了解到底发生了什么(最近 post 此处:https://medium.com/bpxl-craft/event-delivery-on-ios-part-1-8e68b3a3f423#.og2cpaeb0)。