Giter VIP home page Giter VIP logo

Comments (6)

pauljohanneskraft avatar pauljohanneskraft commented on May 29, 2024

The approaches are very similar to how the Apple implementation works and therefore do not necessarily need specific documentation here imho. If you feel different about this, feel free to open a pull request with a more extensive explanation.

There are two possible approaches on how to display the current user position.

1. The 'default' way:

You can simply use the MapInformationVisibility parameter when initializing the map:

Map(
    coordinateRegion: $region, // you can also use mapRect here, does not make a difference for this example
    informationVisibility: .default.union(.userLocation)
)

This will show the user location as it does in the Maps app. The appearance is hereby fixed - if you need a custom appearance, please look at the following option:

2. The 'custom' way:

Specify an annotation as you normally would that reflects the user location by first defining an annotation item type:

struct UserLocationAnnotation: Identifiable {
    var id = UUID()
    let coordinate: CLLocationCoordinate2D
    // of course, you can add more properties here that might be helpful when creating the annotation itself from this annotation item (e.g. color, text, etc)
}

Not let's plug it into a Map:

struct MyMapView: View {
    
    @State private var annotationItems = [UserLocationAnnotation]()

    var body: some View {
        Map(
            coordinateRegion: $region, // you can also use mapRect here, does not make a difference for this example
            annotationItems: annotationItems
        ) { annotationItem in
            MapMarker(coordinate: annotationItem.coordinate, tint: .red) 
            // This could be any kind of annotation, e.g. ViewMapAnnotation, MapPin and MapMarker
        }
    }

}

Now you would only need to somehow set the state according to the locations received from your CLLocationManager. You could also use an @Published property inside an ObservableObject using the ObservedObject/StateObject/EnvironmentObject property wrappers. One thing you will need to make sure is to not create the identifiable objects inside the body, since they would be removed and added on each redraw of the map, which would be quite costly performance-wise (this is the case in Apple's Map SwiftUI implementation as well btw).

from map.

Nickbarbieri1 avatar Nickbarbieri1 commented on May 29, 2024

Thank you for your answer, but I'm still having problems with user position visualization, especially with the "default" way: when the map appears on the view is centered on the user position, but it doesn't show a dot/mark on the map (as Apple Maps does); furthermore, the Location manager, that at the beginning of the app it was working good starts to raise errors (managed by callback function didFailWithError).
I'm also sure that Location Manager class works well because using a standard Map object from MapKit I get rid of the errors.

from map.

pauljohanneskraft avatar pauljohanneskraft commented on May 29, 2024

You will still need to handle authorization, maybe this is the issue? This library is simply setting showsUserLocation on MKMapView, so there should not really be an issue in any way. I sadly don't have the time to dig into this deeper at the moment, but I remember that this definitely worked a couple of weeks ago.

Which version of this library are you using? Could you maybe try the latest main commit?

from map.

Nickbarbieri1 avatar Nickbarbieri1 commented on May 29, 2024

I tried to add the package inside my Xcode project specifying the main branch rather than the default version proposed by Xcode and it starts to work correctly.
Thank you very much for your help and I', very sorry for wasting your time for a stupid thing.

from map.

pauljohanneskraft avatar pauljohanneskraft commented on May 29, 2024

great! not a waste of time at all - it tells me that I will need to release a new version soon, so that this bug does not appear for new users of this library.

from map.

Nickbarbieri1 avatar Nickbarbieri1 commented on May 29, 2024

@pauljohanneskraft i also noticed that there is one reported bug left, about the name clash of UserTrackingMode inside the main branch.
I noticed it now, trying to adapt the Map to the new initialization inside my app.

from map.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.