Как отложить вывод вызова, когда аннотация выбрана в MKMapView? Swift 4

(Это мой первый вопрос о переполнении стека, ха-ха)

ОБНОВЛЕНИЕ: По этой ссылке - Центр MKMapView ПЕРЕД отображением выноски

Я реализовал решение от "Термометра", однако, выбрав и отменив выбор аннотации, я вижу, что мое приложение глючит.

Я думаю, что лучшим способом было бы отложить появление callOut (всплывающих подробностей) на несколько секунд, чтобы у карты было время для перемещения в первую очередь.

Вот мой код:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    guard let annotation = view.annotation else {
        return
    }

    let currentAnnotation = view.annotation as? MapMarker
    Global.currentAnnotation = currentAnnotation
    findRelatinoshipLines()

    if Global.showLifeStoryLines {
        var locations = lifeStoryAnnotations.map { $0.coordinate }
        let polyline = MKPolyline(coordinates: &locations, count: locations.count)
        Global.finalLineColor = Global.lifeStoryColor
        mapView.addOverlay(polyline)
    }

    if Global.showFatherLines {
        var fatherLocations = fatherTreeAnnotations.map { $0.coordinate }
        let fatherPolyline = MKPolyline(coordinates: &fatherLocations, count: fatherLocations.count)
        Global.finalLineColor = Global.fatherLineageColor

        mapView.addOverlay(fatherPolyline)
    }

    if Global.showMotherLines {
        var motherLocations = motherTreeAnnotations.map { $0.coordinate }
        let motherPolyline = MKPolyline(coordinates: &motherLocations, count: motherLocations.count)
        Global.finalLineColor = Global.motherLineageColor

        mapView.addOverlay(motherPolyline)
    }

    if Global.showSpouseLines {
        var locations = spouseAnnotations.map { $0.coordinate }
        let polyline = MKPolyline(coordinates: &locations, count: locations.count)
        Global.finalLineColor = Global.spouseColor
        mapView.addOverlay(polyline)
    }

    if Global.zoomChange == true {
        Global.zoomChange = false
    } else {
        let currentRegion = mapView.region
        let span = currentRegion.span
        let location = currentAnnotation!.coordinate
        let region = MKCoordinateRegion(center: location, span: span)

        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            mapView.setCenter(annotation.coordinate, animated: true)
            //mapView.setRegion(region, animated: true)
        }
    }
}

ПРОДОЛЖЕНИЕ:

В основном я работаю над приложением по семейной генеалогии, которое отображает события от родственников на карте.

Когда я нажимаю аннотацию (событие), появляется информация (кому принадлежит событие, где и когда и т. Д.) С информационной кнопкой, показывающей выбранного человека.

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

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

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

Вот несколько скриншотов того, о чем я говорю:

До и после

1 ответ

Решил, позвонив setCenter с небольшой задержкой в mapView(_:didSelect:):

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    guard let annotation = view.annotation else {
        return
    }

    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        mapView.setCenter(annotation.coordinate, animated: true)
    }
}

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