13

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

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

如果我们这样做,当用户的位置发生变化时,这个图钉会移动到新的位置吗?还是我们需要以编程方式处理它?

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

我只想知道这是否可以通过我们自己的自定义视图来完成。

4

2 回答 2

14

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

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

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


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

CLLocationManager使用实现协议的自定义类声明 a 和自定义注解的属性MKAnnotation(或者您可以只使用泛型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;
    }
}

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

于 2012-07-11T15:16:51.830 回答
0

这是2021年的答案。

斯威夫特 5,XCode 12。

if annotation.isKind(of: MKUserLocation.self) {
            let userIdentifier = "user_location"
            
            if let existingView = mapView
              .dequeueReusableAnnotationView(withIdentifier: userIdentifier) {
              return existingView
            } else {
              let view = MKAnnotationView(annotation: annotation, reuseIdentifier: userIdentifier)
              view.image = #imageLiteral(resourceName: "dark_haulerIcon")
              return view
            }
            
        }

And you don't need to write logic for moving the annotation. Come on, It will automatically get done. Just use the above logic.

于 2021-03-31T07:54:36.443 回答