如何在当前位置标注上放置正确的附件按钮?

时间:2012-02-03 16:52:18

标签: ios gps mkmapview mkannotation mkannotationview

我想在当前用户位置标注中添加正确的附件按钮。我发现了一些关于这个主题的问题,但它们似乎对我没用。这是我到目前为止的代码,我已经成功地将正确的附件按钮放到我的其他注释上:

- (MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
        //TODO: this doesn't seem to be working?  
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        MKAnnotationView * aV = [mapView viewForAnnotation:annotation];
        aV.canShowCallout = YES;
        aV.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        return nil;
    }
    return nil;
}

我在几个地方读过,解决方案是为用户位置制作一个自定义的MKAnnotationView,但我还没有看到如何为用户位置做这个 - 我已经成功完成了这个我的地图上的其他注释。

示例代码将是最有帮助的,谢谢!

2 个答案:

答案 0 :(得分:9)

您应该再次获得用户位置注释视图的引用。 以下方法在iOS&gt; = 5

中调用

选项1

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

请参阅下面的委托方法

替代方法

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
     MKAnnotationView* annotationView = [mapView viewForAnnotation:userLocation];   
     annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
}

确保添加委托方法,以便在点击标注按钮时执行任何操作:

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

在任何iOS中,这些方法中的任何一个都会被调用,您可以向其添加右/左辅助按钮。通过检查用户位置注释视图的子视图计数,确保不要添加此按钮两次。

您也可以在运行时添加/删除附件视图,但我相信您不会想要删除它。按钮

答案 1 :(得分:1)

你的主要问题是你在两种情况下都返回nil。您还应该使用重用标识符。

- (MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id<MKAnnotation>)annotation
 {

 if ([annotation isKindOfClass:[MKUserLocation class]]) {
    MKAnnotationView * aV = [mapView dequeueReusableAnnotationViewWithIdentifier:@"locationView"];
    if (aV == nil) 
       aV = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"locationView"];
    aV.canShowCallout = YES;
    aV.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    return aV;
  }
return nil;
}

您还需要实施:

- (void)mapView:(MKMapView *)_mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

表示标注附件的行为。