强制MKMapView viewForAnnotation更新

问题描述 投票:14回答:5

所以我有一个添加了所有引脚的MKMapView,引脚的颜色取决于是否为该引脚设置了值。当我第一次加载应用程序时,调用viewForAnnotation并相应地设置颜色。但是,当我更新引脚的详细信息(例如位置,标题等)时,我还更新了pinColour,发现它没有更新。看起来viewForAnnotation在初始添加后不再被调用。

我已经阅读了许多与此类似的问题,我可以确认mapView.delegate = self;

这是我的viewForAnnotation代码:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MapAnnotation *)annotation
{
    if([annotation class] == MKUserLocation.class)
        return nil;

    NSString *pinIdentifier = annotation.identifier; // This is a unique string for each pin and is getting populated every time!

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:pinIdentifier];

    if(annotationView == nil)
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinIdentifier];
    else
        annotationView.annotation = annotation; // Never had this line fire...

    annotationView.canShowCallout = YES;
    annotationView.animatesDrop = NO;
    annotationView.enabled = YES;
    annotationView.tag = annotation.counter;

    if(annotation.pinColour == Stopped) // from enum
        annotationView.pinColor = MKPinAnnotationColorRed;
    else
        annotationView.pinColor = MKPinAnnotationColorGreen;

    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [infoButton addTarget:self action:@selector(mapCalloutButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    infoButton.tag = annotation.counter;
    annotationView.rightCalloutAccessoryView = infoButton;

    return annotationView;
}

这是我添加引脚的代码:

CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latestPosition.latitude;
annotationCoord.longitude = latestPosition.longitude;

MapAnnotation *annotation = [[MapAnnotation alloc] init];
annotation.coordinate = annotationCoord;
annotation.identifier = theIdentifier;
annotation.title = theTitle;
annotation.subtitle = theSubtitle
annotation.pinColour = [self getPinColour];
annotation.counter = theCounter;

[theMapView addAnnotation:annotation];

这是我更新引脚的代码(要添加的不同方法):

updatePin = true;
pinCounter = mapPin.counter;

CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latestPosition.latitude;
annotationCoord.longitude = latestPosition.longitude;
[mapPin setCoordinate:annotationCoord];

mapPin.identifier = theIdentifier;
mapPin.subtitle = theSubtitle;
mapPin.pinColour = [self getPinColour];

我不确定我错过了什么。 viewForAnnotation显然正在工作,它只是在最初添加之后才被调用!如果它是调用此函数我100%肯定它会工作,因为它重新启动应用程序的颜色变化!

编辑:哦,我真的不想开始删除注释并重新添加它们。这就是我在短期内所做的事情!

ios cocoa-touch mkmapview mkannotation mkannotationview
5个回答
13
投票

由于地图视图缓存其注释的方式,如果需要更改其外观,则需要删除并重新添加注释。一个简单的删除和添加是要走的路。没有缓存失效机制,但这。


41
投票

实际上,我不知道这对你有用,但这就是我做的。

我不需要从地图中删除注释。我需要做的就是告诉地图给我一个参数注释的注释视图。地图将返回正确的注释。从那里,我有一个属性用于我的自定义注释,以确定它是否是一个活动项目,如果是,显示正常的图像,否则显示完整的图像。

-(void)updateAnnotationImage:(CustomAnnotation *)paramAnnotation
{
    MKAnnotationView *av = [geoMap viewForAnnotation:paramAnnotation];

    if (paramAnnotation.active)
    {
        av.image = [UIImage imageNamed:@"PinNormal.png"];
    }
    else
    {
        av.image = [UIImage imageNamed:@"PinFull.png"];
    }
}

有点晚,但希望它能帮助遇到这个问题的其他人。


2
投票

我也发现这个答案有用:In which case that mapView:viewForAnnotation: will be called?

每当你调用addAnnotation方法时

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation gets called. 

0
投票

Swift 2.1:

我有同样的问题,并找到了一个快速的解决方案,在需要时触发它,也将它发送到主线程是明智的:

var annotationsArray = mapView.annotations
mapView.removeAnnotations(mapView.annotations)
mapView.addAnnotations(arrayIncs)
arrayIncs.removeAll()

0
投票

花了几个小时才开始在Xamarin上工作;这是对其他Xamarin开发人员的警告。确保使用ViewForAnnotation方法而不是GetViewForAnnotation委托。我使用的是错误的方法,它返回了新的注释视图而不是现有的注释视图...当然它不起作用!

© www.soinside.com 2019 - 2024. All rights reserved.