Не удается нажать на выноску аннотации, если она перекрывается с другой аннотацией?

Я показываю набор аннотаций на MKMapView, используя пользовательский MKMarkerAnnotationView с displayPriority = .required, чтобы не было кластеризации или скрытия, и UIButton как его rightCalloutAccessoryView.

Когда я касаюсь аннотации на карте, выноска отображается, как и ожидалось, но когда я касаюсь выноски или ее аксессуара, если касание перекрывается с другим маркером на карте, касание не регистрируется.

Ниже приведен удобный для Playground пример проблемы. Обратите внимание, что выноска не реагирует на нажатия, когда она перекрывается с другой аннотацией на карте.

import MapKit
import PlaygroundSupport

class MapViewController: UIViewController, MKMapViewDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView,
                 calloutAccessoryControlTapped control: UIControl) {
        print("Callout tapped!")
    }
}

class CustomAnnotationView: MKMarkerAnnotationView {
    override var annotation: MKAnnotation? {
        willSet {
            canShowCallout = true
            rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
            titleVisibility = .hidden
            subtitleVisibility = .hidden
            displayPriority = .required
        }
    }
}

let mapView = MKMapView(frame: CGRect(x:0, y:0, width:800, height:800))
let controller = MapViewController()
mapView.delegate = controller

mapView.register(CustomAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)

let coordinate1 = CLLocationCoordinate2DMake(37.334922, -122.009033)
let annotation1 = MKPointAnnotation()
annotation1.coordinate = coordinate1
annotation1.title = "Annotation 1"
annotation1.subtitle = "Subtitle 1"

let coordinate2 = CLLocationCoordinate2DMake(37.335821492347556, -122.0071341097355)
let annotation2 = MKPointAnnotation()
annotation2.coordinate = coordinate2
annotation2.title = "Annotation 2"
annotation2.subtitle = "Subtitle 2"

mapView.addAnnotation(annotation1)
mapView.addAnnotation(annotation2)

var mapRegion = MKCoordinateRegion()
let mapRegionSpan = 0.02
mapRegion.center = coordinate1
mapRegion.span.latitudeDelta = mapRegionSpan
mapRegion.span.longitudeDelta = mapRegionSpan
mapView.setRegion(mapRegion, animated: true)

let mapViewController = MapViewController()
PlaygroundPage.current.liveView = mapView

И изображение, иллюстрирующее проблему.

Не удается нажать на выноску аннотации, если она перекрывается с другой аннотацией?

Любая помощь в этом будет очень признательна. Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
507
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мой товарищ по команде смог решить эту проблему. Идея состоит в том, чтобы отключить взаимодействие с пользователем для всех других аннотаций на карте, когда аннотация выбрана, а затем снова включить его, когда аннотация будет отменена.

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    for nearbyAnnotation in mapView.annotations {
        let annotationView = mapView.view(for: nearbyAnnotation)
        if annotationView != nil {
            annotationView!.isUserInteractionEnabled = false
        }
    }
    view.isUserInteractionEnabled = true
}

func mapView(_ mapView: MKMapView, didDeselect _: MKAnnotationView) {
    for nearbyAnnotation in mapView.annotations {
        let annotationView = mapView.view(for: nearbyAnnotation)
        if annotationView != nil {
            annotationView!.isUserInteractionEnabled = true
        }
    }
}

Другие вопросы по теме