view GeoQuiz/Helpers/CityMap.swift @ 8:e09959b4e4a8

fix bugs
author Dennis C. M. <dennis@denniscm.com>
date Thu, 06 Oct 2022 11:14:34 +0200
parents d945e52b0704
children
line wrap: on
line source

//
//  CityMap.swift
//  GeoQuiz
//
//  Created by Dennis Concepción Martín on 4/10/22.
//

import SwiftUI
import MapKit

struct CityMap: View {
    @ObservedObject var game: CityGame
    @State private var mapImage: UIImage? = nil
    
    let geo: GeometryProxy
    
    var body: some View {
        VStack {
            if let mapImage = mapImage {
                Image(uiImage: mapImage)
                    .resizable()
                    .scaledToFit()
                    .clipShape(RoundedRectangle(cornerRadius: 20))
                    .shadow(radius: 10)
            } else {
                ProgressView()
            }
        }
        .onChange(of: game.correctAnswer.value) { _ in getMapImage() }
        .onAppear(perform: getMapImage)
    }
    
    private func getMapImage() {
        let region = MKCoordinateRegion(
            center: CLLocationCoordinate2D(
                latitude: game.correctAnswer.value.lat,
                longitude: game.correctAnswer.value.lon
            ),
            span: MKCoordinateSpan(
                latitudeDelta: 0.1,
                longitudeDelta: 0.1
            )
        )

        // Map options
        let mapOptions = MKMapSnapshotter.Options()
        mapOptions.region = region
        mapOptions.size = CGSize(width: geo.size.width * 0.8, height: geo.size.width * 0.8)
        mapOptions.pointOfInterestFilter = .excludingAll

        // Create the snapshotter and run it
        let snapshotter = MKMapSnapshotter(options: mapOptions)
        snapshotter.start { (snapshot, error) in
            if let snapshot = snapshot {
                self.mapImage = snapshot.image
            } else if let error = error {
                print(error.localizedDescription)
            }
        }
    }
}

//struct CityMap_Previews: PreviewProvider {
//    static var previews: some View {
//        CityMap(game: CityGame())
//    }
//}