Yes, you can have a custom view for the user's location.
Unfortunately, it's harder to implement than it should be because even though the documentation for the viewForAnnotation delegate method claims that you can just supply your own view if the annotation class is MKUserLocation
, the custom view does not then continue to move with the user's location. In fact, when a custom view is returned for MKUserLocation
, the map view stops updating the user location entirely (the map view's didUpdateUserLocation
delegate method no longer fires). I believe this is a bug.
A workaround is to use CLLocationManager
and a custom annotation...
Make sure showsUserLocation
is NO
or unchecked on the map view.
Declare properties for a CLLocationManager
and a custom annotation using a custom class that implements the MKAnnotation
protocol (or you could just use the generic MKPointAnnotation
class).
In viewDidLoad
or some other appropriate place, create the CLLocationManager
, set its delegate
and call startUpdatingLocation
.
In the location manager's didUpdateToLocation
delegate method (not the map view's didUpdateUserLocation
delegate method), create or update your custom annotation:
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
if (myUserLocAnnot == nil)
{
self.myUserLocAnnot = [[[MyUserLocClass alloc] init] autorelease];
//remove the autorelease if using ARC
myUserLocAnnot.title = @"You are here";
myUserLocAnnot.coordinate = newLocation.coordinate;
[mapView addAnnotation:myUserLocAnnot];
}
else
{
myUserLocAnnot.coordinate = newLocation.coordinate;
}
}
Finally, in the map view's viewForAnnotation
delegate method, you would return a custom annotation view if the annotation is your custom user location annotation.