Настроить аннотацию в MapKit в swiftUI - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь настроить мою аннотацию в MapKit и SwiftUI.

. Из приведенного ниже кода я ищу на карте указанную c координату (координаты) и отображаю ее с помощью пользовательской аннотации.

1) Я пытаюсь увеличить размер UIimage, потому что к маленькому (см. Изображение на рисунке) и изменяю цвет, вы понимаете, как?

2) на карте после того, как приложение запускает ее отображение только значок, после того, как я нажму на значок, появится аннотация, есть идеи, как немедленно отобразить мою аннотацию без нажатия?

3) теперь в аннотации мне удается отобразить заголовок и субтитры, как отобразить также координата

struct MapView: UIViewRepresentable {

    let Mm : MapManager
    let coord = CLLocationCoordinate2D(latitude: 52.28792, longitude: 4.73415327)

    class Coordinator: NSObject, MKMapViewDelegate {
        var parent : MapView

        init(_ parent: MapView) {
            self.parent = parent
        }

        func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
            let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "TESTING NOTE")
            annotationView.canShowCallout = true
            annotationView.image = UIImage(systemName: "location.circle")

            return annotationView
        }


    }
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> MKMapView {

    let view =  MKMapView(frame: .zero)
        Mm.georeverseCoordinate(coord) { (pin) in

                if let pinOK = pin {

                    view.removeAnnotation(pinOK)
                    view.mapType = MKMapType.satellite
                    let span = MKCoordinateSpan(latitudeDelta: 0.04, longitudeDelta: 0.04)
                    let region = MKCoordinateRegion(center: self.coord, span: span)
                    view.setRegion(region, animated: true)
                    view.delegate = context.coordinator
                    view.addAnnotation(pinOK)
                }

            }
        return view
    }

    func updateUIView(_ view: MKMapView, context: Context) {

    }

}

Диспетчер карт

class MapManager: NSObject, CLLocationManagerDelegate {

    static let shared = MapManager()




    func georeverseCoordinate(_ coord: CLLocationCoordinate2D , closure:  @escaping (Pin?) -> Void) {

        let location = CLLocation(latitude: coord.latitude, longitude: coord.longitude)


        let geocoder = CLGeocoder()

        geocoder.reverseGeocodeLocation(location) { (arrayResponse, error) in
            if let errorTest = error {
                debugPrint(errorTest.localizedDescription)
                closure(nil)
                return
            }

            if let arrayPins = arrayResponse {

                if let valorePinArray = arrayPins.first {

                    debugPrint(valorePinArray.locality!)
                    debugPrint(valorePinArray.isoCountryCode!)

                    let pin = Pin(title: valorePinArray.locality!, subtitle: valorePinArray.isoCountryCode!, coordinate: valorePinArray.location!.coordinate)

                    closure(pin)

                }
                else { closure(nil) }
            }
            else { closure(nil) }
        }
    }
}

Контактная модель

class Pin:NSObject, MKAnnotation {

    var title : String?
    var subtitle : String?
    var coordinate : CLLocationCoordinate2D
    var color: UIColor?

    init(title: String?, subtitle: String?, coordinate: CLLocationCoordinate2D) {
        self.title = title
        self.subtitle = subtitle
        self.coordinate = coordinate
    }


}

Image to small

1 Ответ

1 голос
/ 26 апреля 2020

1) - Кажется, есть ошибка, из-за которой трудно изменить цвет символов SF с tintColor и указанным режимом рендеринга c, но есть обходной путь, который также позволяет легко изменить размер

В mapView:viewFor annotation добавьте следующее:

annotationView.canShowCallout = true    
annotationView.image = UIImage(systemName: "location.circle")?.withTintColor(.systemGreen, renderingMode: .alwaysOriginal)
let size = CGSize(width: 40, height: 40)
annotationView.image = UIGraphicsImageRenderer(size:size).image {
     _ in annotationView.image!.draw(in:CGRect(origin:.zero, size:size))
}

2) - чтобы показать выноску, как только аннотация добавлена ​​на карту, используйте selectAnnotation.

view.addAnnotation(pinOK)
view.selectAnnotation(pinOK, animated: true)

3) - Координата доступна, когда создается ваша аннотация, поэтому вы можете просто изменить init в классе Pin:

init(title: String?, subtitle: String?, coordinate: CLLocationCoordinate2D) {
    self.coordinate = coordinate
    self.title = "\(coordinate.latitude) : \(coordinate.longitude)"
    self.subtitle = subtitle
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...