2015-05-25 87 views
0

我試圖根據對象值替換MKAnnotationView圖像,代碼被執行但圖像被隨機分配,因此它們與正確的值不匹配。MKAnnotationView無法正常工作

- (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(EventAnnotation *)annotation{ 

if ([annotation isKindOfClass:[MKUserLocation class]]) 
    return nil; 
static NSString* AnnotationIdentifier = @"AnnotationIdentifier"; 
MKAnnotationView *annotationView = [mapview dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; 

if(annotationView) 
    return annotationView; 
else 
{ 
    MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation 
                    reuseIdentifier:AnnotationIdentifier]; 
    annotationView.canShowCallout = YES; 
    annotationView.image = [self setImageByType:annotation]; 
    annotationView.draggable = NO; 

    return annotationView; 
} 
return nil; 
} 

setImageByType方法:

- (UIImage*)setImageByType:(EventAnnotation *)annotation{ 
//Set annotation image depending on its type 
UIImage *image = [[UIImage alloc]init]; 
NSString *type = annotation.type; 

if ([type isEqualToString:@"event"]) { 
    image = [UIImage imageNamed:@"geolocalization_events"]; 
}else if ([type isEqualToString:@"show"]){ 
    image = [UIImage imageNamed:@"geolocalization_shows"]; 
}else if ([type isEqualToString:@"culture"]){ 
    image = [UIImage imageNamed:@"geolocalization_culture"]; 
}else if ([type isEqualToString:@"eat"]){ 
    image = [UIImage imageNamed:@"geolocalization_eat"]; 
}else if ([type isEqualToString:@"drink"]){ 
    image = [UIImage imageNamed:@"geolocalization_drink"]; 
}else if ([type isEqualToString:@"cybercafe"]){ 
    image = [UIImage imageNamed:@"geolocalization_cybercafe"]; 
} 

UIImage *finalImage = [self imageWithImage:image scaledToSize:CGSizeMake(50, 50)]; 

return finalImage; 
} 

調整圖像的大小:

- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { 
//Resize annotation image 
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return newImage; 
} 

我會說比圖像被分配給該視圖的代碼被執行得更快。有任何想法嗎?

回答

1

選項1

嘗試修改此行:

static NSString* AnnotationIdentifier = @"AnnotationIdentifier"; 

向該:

NSString* AnnotationIdentifier = annotation.type; 

選項2

此線之後:

MKAnnotationView *annotationView = [mapview dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; 

加入這一行:

annotationView.image = [self setImageByType:annotation]; 
+0

這似乎是現在的工作很好!你能簡單地解釋一下爲什麼會出現這種問題? (使用選項1) – iDeC

+0

當我回想起使用'UITableView'的「出列」方法時,您返回的對象不是新對象。我還沒有完全調查,但基本上它看起來像對象可以具有與該resuse標識符使用任何其他對象相同的屬性值。實質上,我必須每次完全重新配置對象,將所有屬性設置爲它們應該是的。如果你只需要改變一些東西,那麼我相信這樣的表現會更快。在你的情況下,這是真的,因爲'canShowCallout'和'draggable'不需要設置。 –

+0

您的案例中的性能提升可能無限大,但在其他情況下,出列可能會有用。我認爲使用它的好策略。 –