【问题标题】:iOS SDK Custom pin image is being changed randomly on MapViewiOS SDK 自定义 pin 图像在 MapView 上随机更改
【发布时间】:2012-09-20 15:48:01
【问题描述】:

我有一个使用 MapView 的应用程序,并在其上添加自定义引脚注释。一切正常,但有时会显示另一张图像,我不知道为什么。我从 JSON API 获取数据,它们绝对正确(数据库几个月以来没有更改)。这是我在模型类上用来获取图像资源的函数:

+ (UIImage *)pinImageForType:(VTStationType)type {

    NSString *imageName = nil;

    switch (type) {
        case kVTStationTypeOffstreetParking:
            imageName = @"PinGarage.png";
            break;

        case kVTStationTypeOnstreetParking:
            imageName = @"PinStreet.png";
            break;

        case kVTStationTypeCarwash:
            imageName = @"PinCarwash.png";
            break;

        case kVTStationTypeParkAndRide:
            imageName = @"PinPR.png";
            break;

        default:
            return nil;
        }

    NSLog(@"Image name: %@", imageName);
    return [UIImage imageNamed:imageName];
}

整个代码中没有其他方法可以获取图片资源。有趣的是,有时图像会发生变化,而我在日志中看不到此方法的调用。在我看来,这可能是某种记忆问题。能否请你帮忙?谢谢。

编辑

这里是 viewForAnnotation 委托方法:

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

if ([annotation isKindOfClass:[MKUserLocation class]]) {

    return nil;

} else if ([annotation isKindOfClass:[VTParkingZoneAnnotation class]]) {

    NSLog(@"viewForAnnotation - ParkingZone - %@", annotation);
    return [self parkingOrStationAnnotationView:annotation];

} else if ([annotation isKindOfClass:[VTStationAnnotation class]]) {

    NSLog(@"viewForAnnotation - Station - %@", annotation);
    return [self parkingOrStationAnnotationView:annotation];

} else if ([annotation isKindOfClass:[VTCalloutAnnotation class]]) {

    return [self calloutAnnotationView:annotation];

} else {

    return nil;

}
}

这是我创建视图的方法。 calloutAnnotationView 是一个不同的注解,我们可以忽略它。这里是parkingOrStationAnnotationView的方法:

- (MKAnnotationView *)parkingOrStationAnnotationView:(id<MKAnnotation>)annotation {

MKAnnotationView *pinView = (MKAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationView"];

if (pinView) {
    pinView.annotation = annotation;
    return pinView;
}

pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationView"];
pinView.canShowCallout = NO;

if ([annotation isKindOfClass:[VTParkingZoneAnnotation class]]) {

    pinView.image = ((VTParkingZoneAnnotation *)annotation).parkingZone.pinImage;

} else if ([annotation isKindOfClass:[VTStationAnnotation class]]) {

    pinView.image = ((VTStationAnnotation *)annotation).station.pinImage;

}

return pinView;
}

【问题讨论】:

  • 请显示 viewForAnnotation 委托方法。
  • 我假设 pinImageForType 是从 viewForAnnotation 调用的。它是从哪里调用的,你实际上在哪里出列/创建注释视图?在parkingOrStationAnnotationView和calloutAnnotationView?很可能是视图重用问题。
  • Fliip,你解决了吗?我有同样的问题,刷新地图屏幕时图像会发生变化?
  • 是的,我认为下面的答案是正确的。试试看。

标签: objective-c ios mapkit mkannotationview


【解决方案1】:

在parkingOrStationAnnotationView中,即使重用现有的annotationView,也应该设置图像。

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 2013-05-23
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多