为当前位置注释设置canShowCallOut = NO

我为当前位置图标使用自定义调用(标题和副标题)。 我试图closures默认注释,但它不起作用。

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation { NSLog(@"viewForAnnotation"); if ([annotation isKindOfClass:[MKUserLocation class]]) { MKAnnotationView *userLocationView = [mapView viewForAnnotation:annotation]; userLocationView.canShowCallout = NO; NSLog(@"[annotation isKindOfClass:[MKUserLocation class]"); return nil; } } 

唯一的办法是

 -(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)ann { if([ann.annotation isKindOfClass:[MKUserLocation class]] ) { [mymap deselectAnnotation:ann.annotation animated:NO]; } } 

但它有时滞后。 有没有其他的方法来禁用当前位置注释的默认标注视图? 任何帮助将不胜感激。

为了完成这个任务,需要获取当前位置MKAnnotationView引用。 人们可以在任何地方得到这个参考,但是一旦确定了用户的位置,最好能够得到它。

 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { MKAnnotationView* annotationView = [mapView viewForAnnotation:userLocation]; annotationView.canShowCallout = NO; } 

或者使用下面的方法

  - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { MKAnnotationView *aV; for (aV in views) { if ([aV.annotation isKindOfClass:[MKUserLocation class]]) { MKAnnotationView* annotationView = aV; annotationView.canShowCallout = NO; } } 

如果要在运行时更改canShowCallout属性,则可以使用以下内容

 for (AnnotationClass* annotation in mapView.annotations) { if([annotation isKindOfClass:[MKUserLocation class]] ) { MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation]; annotationView.canShowCallout = NO; } } 

一个更新,使用swift(基于chatur的答案):

 func mapView(mapView: MKMapView!, didAddAnnotationViews views: [MKAnnotationView]!) { for view in views { if view.annotation.isKindOfClass(MKUserLocation) { view.canShowCallout = false } } } 

注意:使用这个,我不需要任何东西来使它工作

这在Swift 3.0 / iOS 10上适用于我。

 func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) { (views.filter { $0.isKind(of: MKUserLocation.self) }).first?.canShowCallout = false } 

而不是遍历所有的视图,我只是依靠filter命令,其次是可选的调用,因为应该只有一个位置,然后将值设置为false。

迅速:

这工作对我来说:只需添加这个委托方法。

 func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) { for var view in views { view.canShowCallout = false } } 
 // Objective-C - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { MKAnnotationView *userLocationView = [mapView viewForAnnotation:userLocation]; userLocationView.canShowCallout = NO; } // Swift 3 func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) { let userAnnotationView = mapView.view(for: userLocation) userAnnotationView?.canShowCallout = false } 

编辑

对不起,让你错了。

我对此感到震惊。

这是我成功做到这一点的唯一方法。 这个方法的问题是你必须改变UserLocation视图。 所以它可能不那么用户友好。

任何方式:

  - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{ if ([annotation isKindOfClass:[MKUserLocation class]]){ MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil]; annotationView.image = [UIImage imageNamed:@"your-icon.png"]; annotationView.enabled=NO; return annotationView; }; ........} 

必须跑到幼儿园把我的孩子:)

祝你好运