Iphone 仅使用CLLocationManager放置蓝点(用户位置)

Iphone 仅使用CLLocationManager放置蓝点(用户位置),iphone,location,mkmapview,cllocationmanager,Iphone,Location,Mkmapview,Cllocationmanager,我已经阅读了无数关于stack和apple文档的帖子,但找不到任何解决这个问题的方法 问题是,如果您将mapView.showsUserLocation设置为YES,则MapKit将开始对您的手机进行自己的GPS查询 来自苹果文档: 将此属性设置为“是”会导致 使用核心位置的地图视图 框架来查找当前的 地点。只要这个财产是 是,地图视图将继续跟踪 用户的位置并更新它 定期 如果您还想使用CLLocationManager,那么当您致电[mylocationmanager startUpdatin

我已经阅读了无数关于stack和apple文档的帖子,但找不到任何解决这个问题的方法

问题是,如果您将mapView.showsUserLocation设置为YES,则MapKit将开始对您的手机进行自己的GPS查询

来自苹果文档:

将此属性设置为“是”会导致 使用核心位置的地图视图 框架来查找当前的 地点。只要这个财产是 是,地图视图将继续跟踪 用户的位置并更新它 定期

如果您还想使用CLLocationManager,那么当您致电[mylocationmanager startUpdatingLocation]时,您正在手机上进行第二次GPS查询

现在您有两个单独的进程要求GPS定位。

在模拟器上没有问题,但是如果你在真实的手机上尝试它,你需要很长时间才能获得GPS位置。10秒-1分钟也是不一致的,而如果关闭mapView.showsUserLocation,则需要2-3秒的时间

一般来说,两者都使用似乎是一种非常糟糕的做法

为了灵活性和控制,我宁愿使用CLLocationManager,但如果不设置mapView.showsUserLocation=YES,则不会得到蓝点

我尝试了通常的覆盖注释方法:例如:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
    if ([annotation isKindOfClass:MKUserLocation.class]) {
        //it's the built-in user location annotation, return nil to get default blue dot...
        return nil;
    }

    //handle your custom annotations...
}
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释
{
if([annotation isKindOfClass:MKUserLocation.class]){
//这是内置的用户位置注释,返回nil获得默认的蓝点。。。
返回零;
}
//处理您的自定义批注。。。
}
但它不起作用,很可能是因为从来没有调用在地图上实际放置用户注释


那么,是否有人有只使用CLLocationManager在地图上放置用户位置的解决方案

仅仅覆盖viewForAnnotation方法是不够的,首先必须通过调用

[mapView addAnnotation:annotationObject];

annotationObject可以是实现MKAnnotation协议的任何类的实例。有关详细信息,请参见《地图工具包指南》中的“注释应用程序”部分

如果您需要在您的位置周围显示蓝色圆点(精度),您可以这样做:

MKCircle *accuracyCircle;

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// when you want update your position and accuracy
[self.mapView removeOverlay:accuracyCircle];
accuracyCircle = [MKCircle circleWithCenterCoordinate:newLocation.coordinate
                                                    radius:newLocation.horizontalAccuracy];
[self.mapView addOverlay:accuracyCircle];
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
if([overlay isKindOfClass:[MKCircle class]])
    {
        MKCircleRenderer * circleRenderer = [[MKCircleRenderer alloc] initWithOverlay:overlay];
        circleRenderer.fillColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.2];
        return circleRenderer;
    }
    return nil;
}
MKCircle*精度圆;
-(void)locationManager:(CLLocationManager*)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation*)oldLocation
{
//当你想更新你的位置和准确性
[self.mapView removeOverlay:accuracyCircle];
accuracyCircle=[MKCircle Circle WithCenterCoordinate:newLocation.coordinate
半径:新位置。水平精度];
[self.mapView addOverlay:accuracyCircle];
}
-(MKOverlayRenderer*)地图视图:(MKMapView*)地图视图渲染器ForOverlay:(id)overlay
{
if([overlay iskindof类:[MKCircle类]])
{
mkcirclerender*circlerender=[[mkcirclerender alloc]initWithOverlay:overlay];
circlerender.fillColor=[UIColor COLOR WITHRED:0绿色:1蓝色:0阿尔法:0.2];
回圈器;
}
返回零;
}

是的,放置我自己的注释是可行的,只是它的外观与内置用户位置图标不同(即,无脉冲动画、内置分辨率缩放等)。也许有人有默认的png图标,我可以使用它?好吧,你可以自定义用于注释的图像,这样你就可以在那里得到蓝点。分辨率缩放也自动内置于所有注释中。脉冲可能更难。如果你有一个iOS开发者帐户,你也可以在苹果开发者论坛上发布你的问题,那里也有真正的苹果工程师,他们可能也能帮助你。最后但并非最不重要的是,我会考虑提交一个bug报告/特征请求,因为这可能不是最佳的/预期的行为。使用自定义注释的问题是,你没有得到跟踪或环的准确性。我现在已经“解决”了这个问题,只在CLLocationManager完成任务后才打开用户位置,然后在需要使用CLLocationManager时关闭它。感谢您的建议,也许我们可以在真正的解决方案出现时更新此线程:)