2009-11-07 29 views
29

Tôi muốn một hình ảnh tải đồng bộ cho MKAnnotationView tùy chỉnh của mình; Tôi đã sử dụng khuôn khổ EGOImageView (nó đi rất tốt với UITableViews), nhưng tôi không làm cho nó hoạt động trên MKMapView. Hình ảnh dường như được tải, nhưng tôi không thể làm mới chúng trên bản đồ - [myMap setNeedsDisplay] không làm gì cả.Làm mới MKAnnotationView trên MKMapView

Trả lời

35

Tôi đã không thử nó bản thân mình, nhưng nó có thể làm việc:
Nhận một cái nhìn cho chú thích bằng MKMapView - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation phương pháp và thiết lập hình ảnh mới với nó.

Edit: Cố gắng để làm điều đó bản thân mình và cách tiếp cận này làm việc tốt cho tôi:

// Function where you got new image and want to set it to annotation view 
for (MyAnnotationType* myAnnot in myAnnotationContainer){ 
    MKAnnotationView* aView = [mapView viewForAnnotation: myAnnot]; 
    aView.image = [UIImage imageNamed:@"myJustDownloadedImage.png"]; 
} 

Sau khi gọi phương pháp này tất cả hình ảnh chú thích đã được cập nhật.

+0

đó là cách thực hiện ngay bây giờ. Nhưng hình ảnh theo cách này được tải đồng bộ. – cocoapriest

+0

Và nếu bạn gọi nó sau khi hình ảnh được tải và thiết lập hình ảnh này để xem - nó không hoạt động? – Vladimir

+0

đó là câu hỏi - cách đặt hình ảnh này sau. Bằng cách đó, hình ảnh không được cập nhật trên MKAnnotationView – cocoapriest

2

Đây là cách duy nhất tôi đã tìm thấy để buộc vẽ lại của MKAnnotationViews:

// lực cập nhật xem bản đồ (nếu không xem chú thích sẽ không vẽ lại)

trung tâm CLLocationCoordinate2D = mapView.centerCoordinate;

mapView.centerCoordinate = center;

Dường như vô dụng, nhưng nó hoạt động.

+1

Không, không. Tôi chỉ cố gắng: ( –

+0

hoạt động cho tôi! Cảm ơn – nurxyz

+0

Làm việc cho tôi quá .. – pnizzle

14

tôi thấy chỉ có một cách đáng tin cậy để cập nhật chú thích, các phương pháp khác không làm việc cho tôi: chỉ cần loại bỏ và thêm chú thích một lần nữa:

id <MKAnnotation> annotation; 

// ... 

[mapView removeAnnotation:annotation]; 
[mapView addAnnotation:annotation]; 

Mã này sẽ thực hiện - [MapView: viewForAnnotation:] là được gọi lại và vì vậy chế độ xem chú thích của bạn sẽ được tạo lại (hoặc có thể được sử dụng lại nếu bạn sử dụng dequeueReusableAnnotationViewWithIdentifier) ​​với dữ liệu chính xác.

+0

tôi đã kết thúc bằng cách sử dụng kỹ thuật này để làm mới chú thích đơn – nurxyz

+0

I đang cố gắng sử dụng phương pháp này, và SO muốn nó hoạt động, nhưng nó dường như không hoạt động đáng tin cậy tùy thuộc vào mức độ phóng to. Đôi khi pin xuất hiện bù đắp sang trái/phải bởi quá nhiều, và chú thích không còn nữa căn chỉnh.(Điều này là với hình ảnh pin có thay đổi tinh tế nhưng nếu không giống hệt nhau trong thành phần, với pin 'trung tâm' ở trung tâm của hình ảnh.) Hmm ... –

+0

Yea Tôi đã tẻ nhạt addAnnotations tất cả một lần nữa để làm mới chúng. – coolcool1994

1

này làm việc cho tôi

#import "EGOImageView.h" 

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    //ENTER_METHOD;  
    if([annotation isKindOfClass:[MKUserLocation class]]) return nil; 
    MKPinAnnotationView *annView; 

    static NSString *reuseIdentifier = @"reusedAnnView"; 
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
    annView.canShowCallout = YES; 
    annView.calloutOffset = CGPointMake(-5.0f, 0.0f); 
    annView.opaque = NO; 
    annView.image = [[UIImage imageNamed:@"tempImage.png"] retain]; 

    YourModel *p = annotation; // make this conform to <MKAnnotation> 
    EGOImageView *egoIV = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"tempImage.png"]]; 
    [egoIV setDelegate:self]; 
    egoIV.imageURL = [NSURL URLWithString:p.theUrlToDownloadFrom]; 
    [annView addSubview:egoIV]; 
    [egoIV release]; 


    return [annView autorelease]; 
} 
1

(tôi không thấy làm thế nào để chỉ ra rằng bài này gắn liền với của zerodiv câu trả lời.) Tôi đã có thể để có được zerodiv của phương pháp để làm việc bằng cách thêm một kickstart các loại, buộc một tọa độ vô nghĩa nhưng khác biệt, sau đó khôi phục lại một cái đúng, đúng. Màn hình không nhấp nháy vì vị trí đầu tiên.

CLLocationCoordinate2D center = mapView.centerCoordinate; 
CLLocationCoordinate2D forceChg; 
forceChg.latitude = 0; 
forceChg.longitude = curLongNum; 

mapView.centerCoordinate = forceChg; 
mapView.centerCoordinate = center; 
Các vấn đề liên quan