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

Posted

技术标签:

【中文标题】用户位置的自定义注释视图不移动地图视图【英文标题】:Custom Annotation view for userlocation not moving the mapview 【发布时间】:2012-07-11 01:50:12 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

确保 showsUserLocationNO 或在地图视图中未选中。

使用实现MKAnnotation 协议的自定义类声明CLLocationManager 和自定义注释的属性(或者您可以只使用通用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 委托方法中,如果注释是您的自定义用户位置注释,您将返回一个自定义注释视图。

【讨论】:

遇到了同样的问题,也许我们可以向苹果提出一个错误 感谢 Anna,它现在可以工作了。即使我怀疑mapview中存在一个错误,当我们设置它时,它没有显示我们的用户位置自定义注释视图。 但是我在这里面临的另一个问题是,一旦开始位置更新,我就会回调到 locationManager:didUpdateToLocation: fromLocation 方法,在该方法中我创建注释并将其添加到地图,但地图即使我正在返回自定义视图,也没有显示我的自定义视图。如果我关闭位置并打开位置,它就可以工作。这里有什么问题吗? 我没有看到这个问题。你是在 viewDidLoad 中调用 startUpdatingLocation 吗? viewDidLoad 是否执行任何其他类型的 UI 阻塞同步操作? @AlexMcPherson:在上面的示例中,技术上是的——因为在您获得位置更新之前不会添加注释。但是 iOS 通常会在您使用最近的已知位置调用 startUpdatingLocation 后不久调用 didUpdateToLocation,即使您没有移动(除非位置服务已关闭、未授权或出现错误)。但是您始终可以在任何位置更新之前(例如在 viewDidLoad 中)使用一些默认值或以前保存的值添加注释。【参考方案2】:

这是 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
            
            
        

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

【讨论】:

以上是关于用户位置的自定义注释视图不移动地图视图的主要内容,如果未能解决你的问题,请参考以下文章

自定义地图注释标注 - 如何控制宽度

在地图视图上长按触发推送 segue

Swift - MKAnnotationView 地图引脚的自定义 UIView

如何将默认蓝色注释用于用户位置而不是我的自定义注释?

地图注释的自定义标题

如何在 MKMapView 上添加的自定义注解中添加标题和副标题?