3
votes

I am adding a custom annotation instead of the pin annotation. Basically, I draw a circle in these annotations and add them to the map. THe problem these custom annotations obscure the user location view ( the blue dot) How do I bring the blue dot to the front.

- (void)mapView:(MKMapView *)mapView 
didUpdateUserLocation:(MKUserLocation *)userLocation 
{
UIView *user = [mapView viewForAnnotation:userLocation];
[mapView bringSubviewToFront:user];
}

However, this is not working for me. The blue user dot is still being covered by my custom annotations. Any ideas how I can get the user location view to appear in front? Cheers

4

4 Answers

6
votes

Try this, it works.:

MKAnnotationView *userLocationView = [self.mapView viewForAnnotation:self.mapView.userLocation];
[userLocationView.superview bringSubviewToFront:userLocationView];
3
votes

I accomplished it like this:

- (void) mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views {
    for (MKAnnotationView *view in views) {
        if ([[view annotation] isKindOfClass:[MKUserLocation class]]) {
            [[view superview] bringSubviewToFront:view];
        } else {
            [[view superview] sendSubviewToBack:view];
        }
    }
}
0
votes

Normally you'd want to have the userLocation view in the back. At least that's the normal behavior for a mapView with pins.

If you really want to bring it to the front, you have to find out the real userLocation view. I believe [mapView viewForAnnotation:userLocation] doesn't give you the real userLocation view (have you checked it's not nil?). I would add a -mapView:didAddAnnotationViews: to your MKMapViewDelegate like this:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
    for (id view in views) {
        if (![view isKindOfClass:[YourCustomAnnotationView class]]) {
            self.userLocationView = view;
        }
    }
}
0
votes

Ortwin's answer did not work for me. The MKUserLocationView is never in that array (at least in my testing).

Instead, get the value from the MKMapView instance directly. Like so:


if (self.userLocationAnnotationView != nil && self.mapView.userLocation != nil) {
  self.userLocationAnnotationView = [self.mapView viewForAnnotation:self.mapView.userLocation];
}

"userLocationAnnotationView" is an ivar I have in my view controller:

MKAnnotationView *userLocationAnnotationView;
@property (nonatomic, retain) MKAnnotationView *userLocationAnnotationView;

When you run this code, the current location view must have already been added. This may not be the case in viewDidLoad for a variety of reasons including: a) no GPS updates yet b) current location is off screen. I'm running this code in:

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading

Good luck!