MKAnnotationView pin.image显示错误的图像

时间:2014-08-06 22:05:30

标签: ios objective-c mkmapview mkannotationview

在设置我的自定义图片图片时,我无法理解我做错了什么。

这是我的mapView:viewForAnnotation方法。如您所见,我希望根据Location对象中的值显示不同的图像。对于大多数人来说这是有效的,并且正确的图像与正确的引脚相关联。然而,有时他们只是完全错误,似乎是随机分配的。

任何指导都将不胜感激!

编辑:我已根据最新评论更新了我的代码。它仍然会导致相同的行为......

- (MKAnnotationView *)mapView:(MKMapView *)MapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        return nil;
    }

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

        MKAnnotationView * pinView = (MKAnnotationView *)[MapView dequeueReusableAnnotationViewWithIdentifier:@"ADClusterableAnnotation"];

        if (pinView == nil)
        {
            pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                   reuseIdentifier:@"ADClusterableAnnotation"];
        } else
        {
            pinView.annotation = annotation;
        }

        Location *selectedLocation = [[[(ADClusterAnnotation *) annotation cluster] annotation] annotation];

        UIButton *rightCallout = [UIButton buttonWithType:UIButtonTypeCustom];
        rightCallout.frame = CGRectMake(0, 0, 23, 23);
        rightCallout.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        rightCallout.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
        pinView.image = nil;
        pinView.canShowCallout = YES;
        [rightCallout setImage:[UIImage imageNamed:@"star.png"] forState:UIControlStateNormal];
        pinView.rightCalloutAccessoryView = rightCallout;

        if (selectedLocation.number.intValue > 4)
        {
            pinView.image = [UIImage imageNamed:@"image3.png"];
        }
        else if (selectedLocation.number.intValue >= 1)
        {
            pinView.image = [UIImage imageNamed:@"image2.png"];
        }
        else if (selectedLocation.number.intValue < 1)
        {
            pinView.image = [UIImage imageNamed:@"image3.png"];
        }
        return pinView;
    }
    return nil;
}

行。我比起点更简单,但我仍然遇到了同样的问题!这真的让我发疯,我不知道我做错了什么。请有人帮忙。

顺便说一下,我正在使用以下内容来聚集我的注释(我不知道这是否会导致问题!):https://github.com/applidium/ADClusterMapView

1 个答案:

答案 0 :(得分:1)

如果pinView在尝试出列后是山峰,则只设置pinView.image。哪个适用于前几页,直到页面已满。如果然后向下滚动屏幕上的那些,则退出视图并重新用于显示的新行。因为它们是从队列中拉出来的,所以你不会改变它们的图像,而是从已经消失的行中看到图像。

基本上你应该建立一个新的pinView,如果你不能出列一个,但你仍然需要设置pinView.image,所以关闭这样的if语句。

if (!pinView) {
    pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation
}                                           reuseIdentifier:@"ADClusterableAnnotation"];