2016-10-19 7 views
0

모든 방법으로 검색하고 시도했으며 아래 코드는 지금까지 나와 있습니다. 나는 코드가 깔끔하지 않은 많은 팁을 시도했지만, 대부분의 것을 제거했으면 좋겠다.재정의 된 hittest가 올바른 값을 반환하더라도 주석이 응답하지 않음

나는 주석 자체의 경계를 벗어나는 배너가있는 맞춤 주석이 있습니다. 나는 배너의 히트 곡에 응답하고 싶다. 나는 배너를 클릭하면

아래의 코드를 사용하여, 나는이 출력을 얻을 : 나는 또한 명중보기를 반환하는 코드를

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! 위의 로그는 주석을 반환합니다.

주석 영역 자체를 클릭하면 예상 한 문구가 나타납니다. 배너를 클릭하면 응답이 없습니다. 나는 실제 주석 영역을 클릭 할 때주의를 기울 였고, 로그는 'nil'만 반환한다는 것을 보여 주었고, 왜 작동하는지 보지 못합니다!

제 질문은 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

나는 그러나 hitTest 수정에 대해 조언을 대신 (주석 자체의 크기를 증가에서 슬라이드 다른보기로 컨테이너 뷰에 주석 및 배너를 나눌 것입니다 후하지만 여전히 내 메인 MKAnnotationView). 이와 같이 응답 체인을 수정하면 향후 OS 릴리스에서 몇 가지 바람직하지 않은 동작이 발생할 수 있습니다.

응답 방향 체인에서 읽고있는 방향을 계속 읽고 싶다면 정확히 읽을 것을 제안합니다 (좋은 최근 게시물 : https://medium.com/bpxl-craft/event-delivery-on-ios-part-1-8e68b3a3f423#.og2cpaeb0).

+0

나는 당신이 제안한대로했고 그것은 매우 잘 작동했다. 내 유일한 문제는 이제 주석의 왼쪽 하단을지도의 지점에두고 싶지만 모든 것이 가운데에있는 것처럼 보입니다. 경계 등을 상쇄하는 시도했지만 아무것도 올바른 결과를 얻을 것으로 보인다. – Denis

+0

특정 재산이 있습니다. Use centerOffset') 자세한 정보는 https://developer.apple.com/reference/mapkit/mkannotationview/1452144-centeroffset – dlbuckley

+0

centerOffset이 완벽하게 작동했습니다. 이전에 오프셋을 사용해 보았습니다. 내 문제를 완전히 해결했습니다. 감사합니다. – Denis