MKAnnotationView影像变更问题(MKAnnotationView image chan

2019-10-23 01:49发布

我有装载了大量的自定义注解(800大约)的的MKMapView。

当我在地图上拖动和我回到注解,它的形象已经与另外一个改变。 对于我来说,似乎是一个缓存的问题。

拖着脚前

在拖动后销

超类头

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MapAnnotation : NSObject <MKAnnotation>

@property (nonatomic, copy) NSString *title;
@property NSString * pinImageName;
@property (nonatomic) CLLocationCoordinate2D coordinate;

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate title:(NSString *)title pinImageName:(NSString *)pinImageName;

- (MKAnnotationView *)getAnnotationView;
@end

子类(即创建问题的)头

#import "MapAnnotation.h"
#import "Company.h"

@interface CompanyAnnotation : MapAnnotation

@property Company *company;
@property UIImage *pinImage;

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate title:(NSString *)title pinImage:(UIImage *)pinImage;
- (MKAnnotationView *)getAnnotationView;

@end

viewForAnnotation委托方法

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation {
    if (annotation == mapView.userLocation){
        return nil;
    }

    MapAnnotation *location = [MapAnnotation new];
    MKAnnotationView *annotationView = [MKAnnotationView new];

    if ([annotation isKindOfClass:[CompanyAnnotation class]]) {
        location = (CompanyAnnotation *)annotation;
        annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"companyAnnotation"];
    }

    if (annotationView == nil) {
        annotationView = [location getAnnotationView];
    } else {
        annotationView.annotation = annotation;
    }
    return annotationView;
}

getAnnotationView方法

- (MKAnnotationView *)getAnnotationView {
    MKAnnotationView * annotationView = [[MKAnnotationView alloc] initWithAnnotation:self reuseIdentifier:@"companyAnnotation"];
    [annotationView setEnabled:YES];
    [annotationView setCanShowCallout:YES];
    [annotationView setContentMode:UIViewContentModeScaleAspectFit];
    [annotationView setImage:self.pinImage];
    [annotationView setFrame:CGRectMake(0, 0, 28, 44)];
    [annotationView setRightCalloutAccessoryView:[UIButton buttonWithType:UIButtonTypeDetailDisclosure]];

    return annotationView;
}

Answer 1:

出队不正在妥善处理viewForAnnotation因为当dequeueReusableAnnotationViewWithIdentifier返回先前使用的视图(当annotationViewnil ),则代码只更新该视图的annotation属性:

if (annotationView == nil) {
    annotationView = [location getAnnotationView];
} else {
    annotationView.annotation = annotation;
}

但是注释视图的image不更新-在取出的观点, image将被设置为与视图最初是为创建(当注释相关联的一个getAnnotationView叫)。

所以,现在的视图显示在新的注释的坐标,但图像还是从以前的注释被用于视图。


有不同的方法来解决这个问题,如创造一个适当的子类MKAnnotationView监视更改其annotation财产,并自动更新与注释相关联的所有其他属性。

与现有的代码,一个简单的方法来解决它是以分离出特定注解的属性更改到一个单独的方法,该方法可以被称为两者被创建视图时,并且当它的annotation属性被更新。

例如,在CompanyAnnotation ,创建这样的方法:

-(void)configureView:(MKAnnotationView *)av
{
    av.image = self.pinImage;
}

然后换getAnnotationView到:

- (MKAnnotationView *)getAnnotationView {
    MKAnnotationView * annotationView = [[MKAnnotationView alloc] initWithAnnotation:self reuseIdentifier:@"companyAnnotation"];

    //set properties here that are not specific to an annotation...
    [annotationView setEnabled:YES];
    [annotationView setCanShowCallout:YES];
    [annotationView setContentMode:UIViewContentModeScaleAspectFit];
    //[annotationView setImage:self.pinImage];
    [annotationView setFrame:CGRectMake(0, 0, 28, 44)];
    [annotationView setRightCalloutAccessoryView:[UIButton buttonWithType:UIButtonTypeDetailDisclosure]];

    //set properties that are specific to an annotation...
    [self configureView:annotationView];

    return annotationView;
}

最后,在viewForAnnotation

if (annotationView == nil) {
    annotationView = [location getAnnotationView];
} else {
    annotationView.annotation = annotation;

    if ([annotation isKindOfClass:[CompanyAnnotation class]]) {
        //update image, etc...
        [annotation configureView:annotationView];
    }
}

需要注意的是MapAnnotation将有同样的问题与pinImageName财产。



文章来源: MKAnnotationView image changing issue