Как отложить вывод вызова, когда аннотация выбрана в MKMapView?Swift 4 - PullRequest
0 голосов
/ 27 ноября 2018

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

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

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

Я думаю, что лучшим способом было бы отложить появление 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 Ответ

0 голосов
/ 27 ноября 2018

Решил, позвонив 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)
    }
}

enter image description here

...