即使重写的hittest返回正确的值,注释也不响应命中

时间:2016-10-19 09:09:00

标签: ios swift mkannotationview

我已经搜索并尝试了各种解决方案,下面的代码是我到目前为止所提出的。我尝试了很多提示代码不整洁,但我希望我已经删除了大部分内容。

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

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

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
}

}

1 个答案:

答案 0 :(得分:0)

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

我建议您阅读应答器链,了解最新情况,如果您仍然想要朝这个方向发展(最近发表的一篇好文章:https://medium.com/bpxl-craft/event-delivery-on-ios-part-1-8e68b3a3f423#.og2cpaeb0)。