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

Nav*_*een 13 map mkmapview ios

我们可以为iOS中的用户当前位置设置自定义注释视图吗?

我需要用我自己的自定义视图(比如一些ping引脚)删除蓝点(带圆圈).是否有可能做到这一点?

如果我们这样做,当用户位置发生变化时,此引脚是否会移动到新位置?或者我们需要以编程方式处理它吗?

我观察到如果我们对用户的当前位置使用默认蓝点,那么当用户位置发生变化时,它会在地图中更新.

我只想知道是否可以使用我们自己的自定义视图完成此操作.

小智 14

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

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

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


确保showsUserLocationNO或取消选中在地图视图.

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

viewDidLoad其他适当的位置,创建CLLocationManager,设置delegate和调用startUpdatingLocation.

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

-(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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