左侧标注图像未显示在MKMapView注释视图中

时间:2012-05-04 22:16:11

标签: objective-c ios mapkit

我不知道我做错了什么,但它不会工作。

我的mapView: viewForAnnotation:看起来像这样:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"ImageMapView"];
    if (!aView)
    {
        aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"ImageMapView"];
        aView.canShowCallout = YES;
        aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        aView.leftCalloutAccessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
    }
    [(UIImageView *)aView.leftCalloutAccessoryView setImage:nil];
    aView.annotation = annotation;
    return aView;
}

所以每个新的注释都以左侧标注中的空白图像视图开始。

现在,当触摸标注时,将执行下一个代码:

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    //loading an image
    [(UIImageView *)view.leftCalloutAccessoryView setImage:image];
}

在记录的帮助下,我知道图像的网址和数据都没问题,而图像本身并不是零,但左侧标注中没有显示任何内容。

有人可以建议我如何找出这个问题的根源?

修改

我添加了一些日志,所以我可以看到发生了什么:

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    UIImage *image = [self.delegate imagesMapViewController:self thumbnailForAnnotation:view.annotation];
    NSLog(@"Image was: %@", [(UIImageView *)view.leftCalloutAccessoryView image]);
    NSLog(@"Image received: %@", image);
    [(UIImageView *)view.leftCalloutAccessoryView setImage:image];
    NSLog(@"Image became: %@", [(UIImageView *)view.leftCalloutAccessoryView image]);
}

我最后得到了下一个输出:

Image was: (null)
Image received: <UIImage: 0x7933470>
Image became: <UIImage: 0x7933470>

所以图像正在设置,但没有显示,我不明白为什么。此外,第一个日志记录信息仅在第二个注释视图被录制后出现,因此第一个注释视图不会调用mapView: didDeselectAnnotationView:

这是非常不寻常的。

当我把

[(UIImageView *)aView.leftCalloutAccessoryView setImage:[self.delegate imagesMapViewController:self thumbnailForAnnotation:aView.annotation]];

而不是

[(UIImageView *)aView.leftCalloutAccessoryView setImage:nil];

mapView: viewForAnnotation:所有左侧标注配件都有他们应该的图像,但关闭源我想按需下载图像

4 个答案:

答案 0 :(得分:5)

问题是,你使用

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view

何时使用

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

干杯)

答案 1 :(得分:2)

如果您从变量加载图像,我认为您的didSelectAnnotationView方法不起作用。如果是这样,您需要参考原始注释:

-(void) mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    MyAnnotation *pin = (MyAnnotation *) [view annotation];
    view.leftCalloutAccessoryView =  [[UIImageView alloc] initWithImage:[UIImage imageNamed:pin.flag]];

}

希望这能增强原来的答案......:)

答案 2 :(得分:1)

在我的作品中,我有一个从MapViewController到UIImageView的推送segue,其中标识符为Push segue设置。

我在.h:

中的MapViewController中有这个协议
    @protocol MapViewControllerDelegate <NSObject>
    -(void)mapViewController:(MapViewController *)sender imageForAnnotation:(MKAnnotationView *)annotation;
    -(void)mapViewController:(MapViewController *)sender annotationSegue:(id <MKAnnotation>)annotation;
    @end

然后我在MapViewController.h @interface中定义委托:

    @property (nonatomic, weak) id <MapViewControllerDelegate> delegate;

您可能不需要上述所需的协议方法。我不确定。

我看到你的viewforAnnotation和我之间的区别是我翻了两行:

    aView.annotation = annotation;
    [(UIImageView *)aView.leftCalloutAccessoryView setImage:nil];

在此方法之后,您会看到地图并选择引脚。然后它转到didSelectAnnotioatnView,如上所示与委托。

我还有一个PhotoListTableViewController,它有这个方法:

    -(void)mapViewController:(MapViewController *)sender imageForAnnotation:(MKAnnoatioatnView *)annotation
    {
        dispatch_queue_t downloadQueue = dispatch_queue_create ("flickrUrls", NULL);
        dispatch_asynch(downloadQueue, ^{
            FlickrPhotoAnnotation *fpa = (FlickrPhotoAnnotation *) annotation.annotation;
            NSURL *url = [FlickrFetcher urlForPhoto:fpa.phot format:FlickrPhotoFormatSquare];
            NSData *data = [NSData dataWithContentsOfURL:url];
            dispatch_async(dispatch_get_main_queue(), ^{
                UIImage *image = [UIImage imageWithData:data];
                [(UIImageView *)annotation.leftCalloutAccessoryView setImage:image];
            });
        });
        dispatch_release(downloadQueue);
    }

所以我相信这显示了根本原因(上图)。所以你可以看到,上面设置了图像。你初始化它的方法是nil开始。另外,我的PhotoListTableViewController在你看到的@interface的.m部分实现了上面的方法

    @interface PhotoListTableViewController()<MapViewControllerDelegate>

答案 3 :(得分:0)

我刚刚这样做了:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

    if([view.annotation isKindOfClass:[MyLocation class]]) {

        __weak MKAnnotationView *weakView = view;

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            NSData *data = [NSData dataWithContentsOfURL:((MyLocation*)weakView.annotation).thumbnailUrl];
            UIImage *image = [UIImage imageWithData:data];

            dispatch_async(dispatch_get_main_queue(), ^ {

                UIImageView *imgView = [[UIImageView alloc] initWithImage:image];
                weakView.leftCalloutAccessoryView = imgView;
            });
        });
    }
}

这意味着它只是开始下载它,当它完成时,它动画视图为图像腾出空间。