且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

用户位置的自定义注释视图不移动地图视图

更新时间:2022-12-30 10:19:22

是的,您可以为用户的位置设置自定义视图.

不幸的是,它比它应该更难实现,因为即使 viewForAnnotation 委托方法的文档 声称如果注释类是 MKUserLocation,自定义视图不会继续随着用户的位置移动.事实上,当为 MKUserLocation 返回自定义视图时,地图视图会完全停止更新用户位置(地图视图的 didUpdateUserLocation 委托方法不再触发).我相信这是一个错误.

解决方法是使用 CLLocationManager 和自定义注释...


确保 showsUserLocation 在地图视图中为 NO 或未选中.

使用实现 MKAnnotation 协议的自定义类声明 CLLocationManager 和自定义注释的属性(或者您可以只使用通用的 MKPointAnnotation 班级).

viewDidLoad 或其他合适的地方,创建CLLocationManager,设置它的delegate 并调用startUpdatingLocation.

位置管理器的didUpdateToLocation委托方法(不是地图视图的didUpdateUserLocation委托方法),创建或更新您的自定义注释:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{如果(myUserLocAnnot == nil){self.myUserLocAnnot = [[[MyUserLocClass alloc] init] autorelease];//如果使用ARC,则删除自动释放myUserLocAnnot.title = @"你在这里";myUserLocAnnot.coordinate = newLocation.coordinate;[mapView addAnnotation:myUserLocAnnot];}别的{myUserLocAnnot.coordinate = newLocation.coordinate;}}

最后,在地图视图的 viewForAnnotation 委托方法中,如果注释是您的自定义用户位置注释,您将返回自定义注释视图.

Can we have custom annotation view for the users current location in iOS?

I need to remove the blue dot (with circles) with my own custom view (say some ping pin). Is it possible to do this?

If we do, does this pin move to new location when there is change in user's location? Or do we need to handle it programmatically?

I observed that if we use default blue dot for user's current location, then its gets updated in the map when there is change in user location.

I just want to know if this can be done with our own custom view.

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.