用户定位注释视图不会移动mapview [英] Custom Annotation view for userlocation not moving the mapview

查看:114
本文介绍了用户定位注释视图不会移动mapview的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我需要用自己的自定义视图删除蓝点(带圆圈)(说一些ping pin)。有可能做到吗?



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



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



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

解决方案

是的,您可以为用户的位置定制视图。



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



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



确保 showsUserLocation NO 或在地图视图上取消选中。



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



viewDidLoad 或其他适当的地方,创建 CLLocationManager ,设置其委托并调用 startUpdatingLocation



位置经理的 didUpdateToLocation 委托方法地图视图的 didUpdateUserLocation delegate方法),创建或更新您的自定义注释:

$ b $ (CLLocationManager *)经理didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
if(myUserLocAnnot == nil)
{
self.myUserLocAnnot = [[[MyUserLocClass alloc] init] autorelease];
//如果使用ARC
删除自动释放myUserLocAnnot.title = @你在这里;
myUserLocAnnot.coordinate = newLocation.coordinate;
[mapView addAnnotation:myUserLocAnnot];
}
else
{
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.

这篇关于用户定位注释视图不会移动mapview的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆