'Swift UI - User Location is not centered on mapkit, resizing Map jumps back to location

I want to build a map which shows the user location, the zoom scale and can be switched between standard maptype and hybrid maptype.

For testing reasons, I didn't integrate the mapstyle-picker yet. I helped me out by implementing the map.mapType variable, but that doesn't work.

Another problem I have is about the user location: I integrated a LocationManager class which returns the actual position - that works - but if I scroll or zoom on the map, after 5 seconds the screen jumps back to the user location.

I would be glad if you could help me with that. I attach my both files.

Thanks for your help!

UPDATE

So after I searched in stackoverflow I found this thread, SwiftUI mapkit set region to user's current location and implemented these into my code. But now I've the problem, that I didn't see my actual position when the map starts as centered view, I see only the hardcoded one.

MapModel.swift

struct MapModel: UIViewRepresentable {
    
    @Binding var region: MKCoordinateRegion
    var mapType : MKMapType
    var userTracking: MKUserTrackingMode
    var showsUserLocation: Bool
//    var annotation: GCModel
    
    
    init(
         region: Binding<MKCoordinateRegion>,
         mapType: MKMapType,
         userTrackingMode: MKUserTrackingMode,
         showsUserLocation: Bool = true
//         annotation: GCModel = GCModel(title: "", coordinate: CLLocationCoordinate2D(latitude: 0, longitude: 0))
    ){
        self._region = region
        self.mapType = mapType
        self.userTracking = userTrackingMode
        self.showsUserLocation = showsUserLocation
//        self.annotation = annotation
        
    }
    
    func makeUIView(context: Context) -> MKMapView {
        let mapView = MKMapView()
        
        mapView.setRegion(region, animated: false)
        mapView.mapType = mapType
        mapView.showsUserLocation = showsUserLocation
        mapView.userTrackingMode = userTracking
        mapView.delegate = context.coordinator
        
        // Add annotation to the map
//        mapView.addAnnotation(annotation.pointAnnotation)
        return mapView
    }
    
    func updateUIView(_ mapView: MKMapView, context: Context) {
        mapView.mapType = mapType
        // Update your region so that it is now your new region
        mapView.setRegion(region, animated: false)
        
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, MKMapViewDelegate {
        var parent: MapModel
        
        init(_ parent: MapModel) {
            self.parent = parent
        }
        
        func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
            // We should handle dequeue of annotation view's properly so we have to write this boiler plate.
            // This basically dequeues an MKAnnotationView if it exists, otherwise it creates a new
            // MKAnnotationView from our annotation.
            guard annotation is MKPointAnnotation else { return nil }
            
            let identifier = "Annotation"
            guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) else {
                let annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
                annotationView.canShowCallout = true
                return annotationView
            }
            
            annotationView.annotation = annotation
            return annotationView
        }
        
        func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
            // We need to update the region when the user changes it
            // otherwise when we zoom the mapview will return to its original region
            DispatchQueue.main.async {
                self.parent.region = mapView.region
            }
        }
    }
}

MapView.swift

struct MapView: View {
    
    @State var trackingMode: MKUserTrackingMode = .follow
    @ObservedObject private var managerDelegate = LocationManager()
    @State private var mapType: MKMapType = .standard
    
    var body: some View {
        VStack {
            MapModel(
                region: $managerDelegate.region,
                mapType: mapType,
                userTrackingMode: trackingMode,
                showsUserLocation: true
            ).edgesIgnoringSafeArea([.bottom,.top])
            
            Picker("", selection: $mapType) {
                Text("Standard").tag(MKMapType.standard)
                Text("Satellite").tag(MKMapType.satellite)
                Text("Hybrid").tag(MKMapType.hybrid)
            }
            .pickerStyle(SegmentedPickerStyle())
            .opacity(0.5)
            Spacer()
            
        }
    }
    
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source