我已经通过堆栈和苹果的文档阅读了无数的帖子,找不到任何解决这个问题的方法。
问题是如果您设置mapView.showsUserLocation = YES,那么MapKit将开始为您的手机提供自己的GPS查询。
来自apple docs:
将此属性设置为YES会导致 地图视图以使用核心位置 找到当前的框架 地点。只要这个属性 是的,地图视图继续跟踪 用户的位置并更新它 周期性。
如果您还想使用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...
}
但它不起作用,很可能是因为从来没有调用在地图上实际放置用户注释。
那么有没有人有解决方案只使用CLLocationManager将用户的位置放在地图上?
答案 0 :(得分:0)
只是覆盖viewForAnnotation方法是不够的,首先必须通过调用
向地图添加注释[mapView addAnnotation:annotationObject];
您的annotationObject可以是实现MKAnnotation协议的任何类的实例。您可以在“注释应用程序”部分的“MapKit指南”中找到详细信息。
答案 1 :(得分:0)
如果您需要在您的位置周围显示蓝点(准确度),您可以这样做:
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;
}