Pergunta

I'm implementing a map feature in my app where I allow the user to set their current location by panning around.

All this time, I want to have an MKAnnotation in the centerCoordinate. So what I want to do is keep track of when the map's centerCoordinate changes and change the annotation's coordinate correctly. The behaviour would be similar to that of Uber, Hailo and others.

I tried a time based implementation where every 0.00001s the centerCoordinate would be checked and the annotation would also be moved. But if the map isn't flicked gently, the annotation jumps from one place to another which doesn't make for a good UI.

Another implementation I tried is by way of gesture recognisers and the delegate methods of MKMapView (regionDidChange/regionWillChange). This, again, makes for a very abrupt transition.

Can anyone please advise me on how to do this better?

Foi útil?

Solução

I suggest not using an actual id<MKAnnotation> at all (at least for this "current location setting" mode).

Instead:

  1. Add a view (eg. UIImageView) containing an image of a pin (or whatever icon you like) in front of the map view.
  2. This pin view should not be a subview of the map view.
  3. The pin view should be a subview of the same view that the map view is a subview of (eg. both should be subviews of the same superview).
  4. The pin view should be sized and positioned such that it appears above the center of the map view (you could make the pin view have the same frame and the same autolayout/autoresizing logic as the map view so they stay visually synchronized regardless of screen size or orientation).
  5. If using a UIImageView, set its content mode to "center" and background color to "clear" (default is clear).
  6. The pin view should have user interaction disabled on it so that the user can still interact with the map view behind it. As the user pans or zooms the map view, the pin view in front will seem to move instantly.
  7. If necessary, the app can get the location coordinates from mapView.centerCoordinate in the regionDidChangeAnimated: MKMapViewDelegate method (or pan/pinch gesture recognizers) or only when the user says they're done positioning. I don't recommend using a timer (especially every 0.00001s) to query the current center coordinate.
  8. When the user indicates that the current position is where they want to finally place the annotation, you can then create and add an actual annotation at that coordinate and hide the "location setting mode" pin view.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top