2009-11-07 13 views
29

Chciałbym synchronicznie ładować obrazy dla mojego niestandardowego MKAnnotationView; Używam już frameworka EGOImageView (działa bardzo dobrze z UITableViews), ale nie uda mi się go uruchomić na MKMapView. Obrazy wydają się być załadowane, ale nie mogę ich odświeżyć na mapie - nie robi nic.Odśwież MKAnnotationView na MKMapView

Odpowiedz

35

Nie próbowałem go samodzielnie, ale może działać:
Uzyskaj widok na adnotację za pomocą metody MKMapView - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation i ustaw dla niej nowy obraz.

Edit: próbował zrobić to sam i to podejście pracował dobrze dla mnie:

// 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"]; 
} 

Po wywołaniu tej metody wszystkie adnotacje obrazy zostały zaktualizowane.

+0

tak się teraz robi. Ale w ten sposób obraz jest ładowany synchronicznie. – cocoapriest

+0

A jeśli nazwiesz to po załadowaniu obrazu i ustawisz ten obraz na widok - czy to nie działa? – Vladimir

+0

to jest pytanie - jak ustawić ten obraz później. W ten sposób obraz nie zostanie zaktualizowany na MKAnnotationView – cocoapriest

2

Jest to jedyny sposób znalazłem zmusić odrysowywanie MKAnnotationViews: aktualizacja

// Siła widoku mapy (inaczej widoki adnotacji nie przerysować)

centrum CLLocationCoordinate2D = mapView.centerCoordinate;

mapView.centerCoordinate = center;

Wydaje się bezużyteczne, ale działa.

+1

Nie, nie ma. Właśnie próbowałem :( –

+0

działa dla mnie! Dzięki – nurxyz

+0

Działa również dla mnie .. – pnizzle

14

Znalazłem tylko jeden niezawodny sposób zaktualizować adnotacji, inne metody nie działają na mnie: po prostu usuwanie i dodawanie adnotacji ponownie:

id <MKAnnotation> annotation; 

// ... 

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

Ten kod pozwoli - [MapView: viewForAnnotation:] się ponownie wywoływany, więc widok adnotacji zostanie utworzony ponownie (lub może być ponownie użyty, jeśli użyjesz opcji dequeueReusableAnnotationViewWithIdentifier) ​​z poprawnymi danymi.

+0

i skończyło się przy użyciu tej techniki dla pojedynczego adnotacje odświeżenie – nurxyz

+0

I próbuję użyć tej metody, a SO chce, aby działała, ale nie wydaje się, aby zachowywała się niezawodnie w zależności od poziomu powiększenia. Czasami pin wydaje się być przesunięty w lewo/w prawo o zbyt wiele, a objaśnienie nie jest już wyrównane.(To jest z obrazami pinowymi, które mają subtelne zmiany, ale są poza tym identyczne pod względem kompozycji, z "środkiem" w samym środku obrazu.) Hmm ... –

+0

Tak, musiałem nużąco dodawać adnotacje, aby je odświeżyć. – coolcool1994

1

ten pracował dla mnie

#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

(nie wiem jak się wskazywać, że ten post dotyczy zerodiv na odpowiedź.) Udało mi się dostać zerodiv na metodę pracy dodając kickstart sortuje, zmuszając nie mająca znaczenia, ale inna współrzędna, a następnie przywracająca poprzednią, poprawną. Ekran nie miga wcale z powodu pierwszej lokalizacji.

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

mapView.centerCoordinate = forceChg; 
mapView.centerCoordinate = center; 
Powiązane problemy