모든 방법으로 검색하고 시도했으며 아래 코드는 지금까지 나와 있습니다. 나는 코드가 깔끔하지 않은 많은 팁을 시도했지만, 대부분의 것을 제거했으면 좋겠다.재정의 된 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
}
}
나는 당신이 제안한대로했고 그것은 매우 잘 작동했다. 내 유일한 문제는 이제 주석의 왼쪽 하단을지도의 지점에두고 싶지만 모든 것이 가운데에있는 것처럼 보입니다. 경계 등을 상쇄하는 시도했지만 아무것도 올바른 결과를 얻을 것으로 보인다. – Denis
특정 재산이 있습니다. Use centerOffset') 자세한 정보는 https://developer.apple.com/reference/mapkit/mkannotationview/1452144-centeroffset – dlbuckley
centerOffset이 완벽하게 작동했습니다. 이전에 오프셋을 사용해 보았습니다. 내 문제를 완전히 해결했습니다. 감사합니다. – Denis