15

我正在为当前位置图标使用自定义标注(标题和副标题)。我尝试以下禁用默认注释,但它不起作用。

- (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];
    }
}

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

4

6 回答 6

28

要做到这一点,需要获取当前位置的参考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;
        }
    }
于 2012-01-12T09:49:18.533 回答
6

使用 swift 对此进行更新(基于chatur的回答):

func mapView(mapView: MKMapView!, didAddAnnotationViews views: [MKAnnotationView]!) {

    for view in views {
        if view.annotation.isKindOfClass(MKUserLocation) {
            view.canShowCallout = false
        }
    }

}

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

于 2015-02-18T14:15:33.557 回答
2

迅速:

这对我有用:只需添加这个委托方法。

func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
    for var view in views {
        view.canShowCallout = false
    }
}
于 2017-01-15T21:13:31.083 回答
1

这在 Swift 3.0 / iOS 10 上对我有用。

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

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

于 2017-01-13T03:53:27.367 回答
1
// Objective-C

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

// Swift 4.2

func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
        let userAnnotationView = mapView.view(for: userLocation)
        userAnnotationView?.canShowCallout = false
}
于 2017-05-07T14:11:19.387 回答
0

编辑

很抱歉让你误会了。

我对此一头雾水。

这是我成功的唯一方法。这种方法的问题是您必须更改 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;
    };
     ........}

必须跑去幼儿园带我的孩子:)

祝你好运

于 2011-12-09T08:50:07.933 回答