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

时间:2012-07-11 12:32:58

标签: ios map mkmapview

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

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

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

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

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

2 个答案:

答案 0 :(得分:14)

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

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

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


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

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

viewDidLoad或其他适当的位置,创建CLLocationManager,设置其delegate并致电startUpdatingLocation

location manager's didUpdateToLocation delegate method地图视图的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委托方法中,如果注释是您的自定义用户位置注释,则会返回自定义注释视图。

答案 1 :(得分:0)

这是 2021 年的答案。

Swift 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
            }
            
        }

而且您不需要编写移动注释的逻辑。来吧,它会自动完成。就用上面的逻辑。