Ios 如何将右侧附件按钮置于当前位置标注上?

Ios 如何将右侧附件按钮置于当前位置标注上?,ios,gps,mkmapview,mkannotation,mkannotationview,Ios,Gps,Mkmapview,Mkannotation,Mkannotationview,我想在当前用户位置标注中添加一个右附件按钮。我发现了一些关于这个话题的问题,但它们似乎不适合我。以下是我迄今为止的代码,我已成功地将右侧附件按钮添加到其他注释中: - (MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id<MKAnnotation>)annotation { //TODO: this doesn't seem to be working? if ([a

我想在当前用户位置标注中添加一个右附件按钮。我发现了一些关于这个话题的问题,但它们似乎不适合我。以下是我迄今为止的代码,我已成功地将右侧附件按钮添加到其他注释中:

- (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*)地图视图:(MKMapView*)\u地图视图用于注释:(id)注释
{
//托多:这好像不起作用?
if([annotation isKindOfClass:[MKUserLocation类]]){
MKAnnotationView*aV=[mapView视图用于注释:注释];
aV.canShowCallout=是;
aV.rightCalloutAccessoryView=[UIButton Button类型:UIButtonTypedTailExposition];
返回零;
}
返回零;
}
我在一些地方读到过,解决方案是为用户位置创建一个自定义MKAnnotationView,但我还没有看到如何为用户位置创建自定义MKAnnotationView的演示——我已经成功地为地图上的其他注释创建了此功能


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

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

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

有关详图索引附件的行为。

同样,您应该获得用户位置注释视图的参考。 在iOS>=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];
}
确保添加委托方法,以便在点击callout按钮时可以执行任何操作:

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
在任何iOS中,都会调用这些方法中的任何一个,您可以向其中添加右/左accessorybutton。通过检查用户位置注释视图的子视图计数,确保不会添加此按钮两次


您也可以添加/删除附件在运行时查看它,但我相信您不会想删除它。按钮看起来很有希望,我会尝试一下并相应地投票!这对你有用吗?我在我的一个应用程序中有几乎相同的代码,我没有遇到任何问题。恐怕没有!我现在在地图上没有看到用户位置标记,有点不对劲。如果我把它改回return nil,那么它会像以前一样工作,但是附件按钮当然不会显示。建议?这不起作用,因为
MKAnnotationView
本身不显示任何内容。您需要设置image属性或使用子类。蓝色用户位置视图由一个名为
MKModernUserLocationView
的私有子类实现(在iOS 7中)@查图尔的回答是正确的。谢谢@chatur,这确实有效!顺便问一下,您如何同时支持iOS4.x和iOS5版本?
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control