1

当我点击一个图钉时,我试图添加一个视图,但只显示标题和副标题,而不是我添加的视图。

这是我的代码

  -(void) inserirMapa {
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
    NSMutableArray *pins = [[NSMutableArray alloc]init]; //array de Annotations
    for(int iCnt = 0; iCnt < [_listaPins count]; iCnt++) {
        Pin *pin = (Pin *) [_listaPins objectAtIndex:iCnt];

        CLLocationCoordinate2D start;
        start.latitude = pin.place.latitude;
        start.longitude = pin.place.longitude;
        MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(start, 800, 800);
        [_myMapView setRegion:[_myMapView regionThatFits:region] animated:YES];

        // Add an annotation
        MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
        point.coordinate = start;
        point.title = @"Where am I?";
        point.subtitle = @"I'm here!!!";

        [_myMapView addAnnotation:point];

        [pins addObject:point];//adiciona a annotation no array
        [point release];
    }
    self.myAnnotations= [NSArray arrayWithArray:pins]; //diz que o array myAnnotations é igual ao array estacionamentos(que contem as annotations
        [pins release];
        [self configurarZoomDoMapaComLatitude:appDelegate.latitude eLongitude:appDelegate.longitude]; //configura o Zoom inicial do mapa


    [_myMapView addAnnotations:_myAnnotations];

    [_viewLoading setHidden:YES];
}

在这里我添加了自定义视图。我在这里放了一个断点并调用了这个函数,但是当我点击一个图钉时,只显示标题和副标题..忽略我添加的视图

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView* annotationView = nil;

    //your code

    UIView *vw = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    vw.backgroundColor = [UIColor redColor];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 50, 50)];
    label.numberOfLines = 4;
    label.text = @"hello\nhow are you\nfine";
    [vw addSubview:label];
    annotationView.leftCalloutAccessoryView = vw;
    return annotationView;

}
4

1 回答 1

7

viewForAnnotation中,代码声明并初始化annotationViewnil但从未实际实例化它(alloc+init)。

因此,委托方法返回nil告诉地图视图“为此注释创建默认视图”。用户位置以外的注释的默认视图是带有标注的红色图钉,仅显示标题和副标题。


但是,如果你只是 alloc+init a plainMKAnnotationView来修复它,注释将不可见,因为默认情况下 anMKAnnotationView没有内容。您需要设置它image或添加一些子视图。

相反,您可以 alloc+init 一个MKPinAnnotationView,默认情况下会显示一个红色引脚。当有很多注释时,
您还应该通过调用来实现注释视图重用以提高性能:dequeueReusableAnnotationViewWithIdentifier

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    static NSString *reuseId = @"ann";

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView 
        dequeueReusableAnnotationViewWithIdentifier:reuseId];
    if (annotationView == nil)
    {
        annotationView = [[MKPinAnnotationView alloc] 
                                 initWithAnnotation:annotation 
                                    reuseIdentifier:@"test"];
        annotationView.canShowCallout = YES;  //set to YES, default is NO

        //your code

        UIView *vw = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
        vw.backgroundColor = [UIColor redColor];
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 50, 50)];
        label.numberOfLines = 4;
        label.text = @"hello\nhow are you\nfine";
        [vw addSubview:label];
        annotationView.leftCalloutAccessoryView = vw;
    }
    else
    {
        //Update view's annotation reference 
        //because we are re-using view that may have
        //been previously used for another annotation...
        annotationView.annotation = annotation;
    }

    return annotationView;
}


这应该可以修复leftCalloutAccessoryView未出现的自定义。
但是,请注意文档对leftCalloutAccessoryView(and rightCalloutAccessoryView) 的说明:

视图的高度应为 32 像素或更小。

代码创建的自定义视图和标签都超过 32 像素高。


关于添加注释的循环的不相关注释:
您不需要setRegion在添加每个注释时调用。
调用setRegion只是告诉地图视图显示指示的区域。
这不需要添加注释(地图不必显示您要添加注释的坐标)。

于 2013-07-26T02:56:34.747 回答