2009-11-26 34 views
6

Tôi đang chú thích bản đồ của mình và đặt hình ảnh tốt, nhưng khi tôi nhấn vào chú thích trên MapView, hình ảnh sẽ chuyển từ hình ảnh tùy chỉnh của tôi trở lại ghim màu đỏ. Tại sao điều này?Tại sao hình ảnh chú thích MKMapView tùy chỉnh biến mất khi chạm?

- (MKAnnotationView *)mapView:(MKMapView *)newMapView viewForAnnotation:(id)newAnnotation { 
    MKPinAnnotationView *annotation = [[MKPinAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"]; 
    if (annotation == nil) { 
     annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"]; 
    } 

    annotation.image = [UIImage imageNamed:@"anno.png"]; 
    annotation.canShowCallout = YES; 
    annotation.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bus_stop_30x30.png"]]; 
    annotation.leftCalloutAccessoryView = imgView; 

    return annotation; 
}

Mã của tôi trông giống hệt một số mã mẫu không tạo ra sự cố này.

Trả lời

17

Trả lời câu hỏi của riêng tôi ở đây, chỉ trong trường hợp những người khác có cùng vấn đề. Lưu ý rằng tôi đang sử dụng "MKPinAnnotationView" - nó sẽ được thay đổi thành "MKAnnotationView" và mọi thứ hoạt động.

Cố định mã:

- (MKAnnotationView *)mapView:(MKMapView *)newMapView viewForAnnotation:(id)newAnnotation { 
    MKAnnotationView *annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"]; 

    if (annotation == nil) { 
     annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"]; 
    } 

    annotation.image = [UIImage imageNamed:@"anno.png"]; 
    annotation.canShowCallout = YES; 
    annotation.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bus_stop_30x30.png"]]; 
    annotation.leftCalloutAccessoryView = imgView; 

    return annotation; 
} 
+0

nhờ cho điều này solution..saved thời gian của tôi .. –

0

Tôi nghĩ rằng đây là một trong những cách tốt nhất:

(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 
{ 
    NSLog(@"welcome into the map view annotation"); 
    MyAnnotation* myAnnotation1=annotation; 

    // if it's the user location, just return nil. 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
    return nil; 

    if([mapView isEqual:mapMainView]== NO) 
    { 
     return nil; 
    } 
    // try to dequeue an existing pin view first 
    // if ([annotation isKindOfClass:[myAnnotation1 class]]) 
    // { 

    // try to dequeue an existing pin view first 
    static NSString* AnnotationIdentifier = @"AnnotationIdentifier"; 

    MKPinAnnotationView* pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; 

    if (nil == pinView) 
    { 
     MKAnnotationView* annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 

     reuseIdentifier:AnnotationIdentifier] autorelease]; 
     // annotationView.canShowCallout = YES; 
     // pinView.animatesDrop=YES; 
     //pinView.pinColor=MKPinAnnotationColorPurple; 

     //image 
     UIImage* flagImage = [UIImage imageNamed:@"map_marker_over2.png"]; 

     CGRect resizeRect; 

     resizeRect.size = flagImage.size; 
     CGSize maxSize = CGRectInset(self.view.bounds, 
     [MapPropertyViewController annotationPadding], 
     [MapPropertyViewController annotationPadding]).size; 
     maxSize.height -= self.navigationController.navigationBar.frame.size.height + [MapPropertyViewController calloutHeight]; 
     if (resizeRect.size.width > maxSize.width) 
     resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height/resizeRect.size.width * maxSize.width); 
     if (resizeRect.size.height > maxSize.height) 
     resizeRect.size = CGSizeMake(resizeRect.size.width/resizeRect.size.height * maxSize.height, maxSize.height); 

     resizeRect.origin = (CGPoint){0.0f, 0.0f}; 
     UIGraphicsBeginImageContext(resizeRect.size); 
     [flagImage drawInRect:resizeRect]; 
     UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     annotationView.image = resizedImage; 
     annotationView.opaque = NO; 

     UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     [rightButton setTitle:annotation.title forState:UIControlStateNormal]; 
     [rightButton addTarget:self 
     action:@selector(showDetails:) 
     forControlEvents:UIControlEventTouchUpInside]; 
     rightButton.tag = myAnnotation1.tagAnnotation; 
     annotationView.rightCalloutAccessoryView = rightButton; 

     profileIconView = [[UIImageView alloc]initWithFrame:CGRectMake(18.5f, 10.0f, 37.0f, 30.0f)]; 
     annotationView.leftCalloutAccessoryView = profileIconView; 
     //image 
     img = [UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:[arrImages objectAtIndex:myAnnotation1.tagAnnotation]]]]; 
     NSLog(@"Annotation Click %d",[arrImages count]); 
     NSLog(@"image %@",img); 
     profileIconView.image=img; 

     [profileIconView release]; 

     [annotationView setEnabled:YES]; 
     [annotationView setCanShowCallout:YES]; 
     return annotationView; 
    } 
    return pinView; 
    // } 
    // return nil; 
} 
+2

Bạn có thể giải thích tại sao không? Nó sẽ giúp độc giả trong tương lai. –

0
Try this if you want to set both Source to Destination pin images different. 

    MKPointAnnotation * sourceAnno= [[MKPointAnnotation alloc] init]; 
    sourceAnno.coordinate=CLLocationCoordinate2DMake(YourSourcelatitude,YourSourcelongitude); 
    [sourceAnno setAccessibilityLabel:@“Source”]; 
    sourceAnno.title = @“You”; 
    [mapview addAnnotation: sourceAnno]; 

    DestinationAnno = [[MKPointAnnotation alloc] init]; 
    DestinationAnno.coordinate = CLLocationCoordinate2DMake(YourDestinationlatitude,YourDestinationlongitude); 
    [DestinationAnno setAccessibilityLabel:@“Destination”]; 
    DestinationAnno.title [email protected]“Destination”; 
    [mapview addAnnotation: DestinationAnno]; 

    In Delegate Method 
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKPointAnnotation *PointAnno=(MKPointAnnotation *)annotation; 
    NSString * kPinAnnotationIdentifier = PointAnno.accessibilityLabel; 
    MKAnnotationView *AnnotationView = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:kPinAnnotationIdentifier]; 

    if ([kPinAnnotationIdentifier isEqualToString:@"Source"]) 
    { 
     AnnotationView.centerOffset = CGPointMake(8, -14); 
     AnnotationView.calloutOffset = CGPointMake(-8, 0); 
     AnnotationView.image = [UIImage imageNamed:@"pin_blue.png"]; 
     AnnotationView.canShowCallout = YES; 
    } 
    else if([kPinAnnotationIdentifier isEqualToString:@"Destination"]) 
    { 
     AnnotationView.centerOffset = CGPointMake(8, -14); 
     AnnotationView.calloutOffset = CGPointMake(-8, 0); 
     AnnotationView.image = [UIImage imageNamed:@"pin_red.png"]; 
     AnnotationView.canShowCallout = YES; 
    } 
    return AnnotationView; 
} 

Cảm ơn bạn

Các vấn đề liên quan