2011-02-02 10 views
21

Dodałem MKCircle jako MKOverlay do mojego MKMapView. Dodałem również UISlider, aby zdecydować o promieniu koła. Niestety, podczas korzystania z tego wydaje się nieco "laggy", nie jest tak gładki jak chcę.MKOverlay nie zmienia rozmiaru płynnie

Przykład: http://dl.dropbox.com/u/3077127/mkoverlayDelay.mov

To jest mój kod:

- (void)addCircle 
{ 
    // draw the radius circle for the marker 
    double radius = 2000.0; 
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:location radius:radius]; 
    [circle setTitle:@"background"]; 
    [mapView addOverlay:circle]; 

    MKCircle *circleLine = [MKCircle circleWithCenterCoordinate:location radius:radius]; 
    [circleLine setTitle:@"line"]; 
    [mapView addOverlay:circleLine]; 
} 

- (void)addCircleWithRadius:(double)radius 
{ 
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:location radius:radius]; 
    [circle setTitle:@"background"]; 
    [mapView addOverlay:circle]; 

    MKCircle *circleLine = [MKCircle circleWithCenterCoordinate:location radius:radius]; 
    [circleLine setTitle:@"line"]; 
    [mapView addOverlay:circleLine]; 
} 

- (void)sliderChanged:(UISlider*)sender 
{ 
    [mapView removeOverlays:[mapView overlays]]; 

    double radius = (sender.value * 100); 

    [self addCircleWithRadius:radius]; 
} 

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay{ 
    MKCircle *circle = overlay; 
    MKCircleView *circleView = [[[MKCircleView alloc] initWithCircle:overlay] autorelease]; 

    if ([circle.title isEqualToString:@"background"]) 
    { 
     circleView.fillColor = UIColorFromRGB(0x598DD3); 
     circleView.alpha = 0.25; 
    } 
    else 
    { 
     circleView.strokeColor = UIColorFromRGB(0x5C8AC7); 
     circleView.lineWidth = 2.0; 
    } 

    return circleView; 
} 

Czy ktoś ma jakieś sugestie, w jaki sposób mogę to wyg?

poważaniem,
Paul Peelen

+1

+1 za dobrze udokumentowane pytanie. Czy istnieje potrzeba usunięcia nakładki, dlaczego nie po prostu ją zaktualizować? –

+0

Dzięki! Nie sądzę, że jest taka potrzeba ... ale jak mogę zaktualizować nakładkę? –

+0

Nie jestem pewien, czy potrafisz? Zawsze uważałem, że nakładki MapKit były niezmienne, nie można ich modyfikować po ich utworzeniu. Ta odpowiedź sugeruje to samo: http://stackoverflow.com/questions/3171572/how-to-update-mkpolyline-mkpolylineview – lxt

Odpowiedz

5

Próbowałem swój kod i znalazłem bardzo łatwy sposób, aby uczynić go bardziej płynne.

Jeżeli zmienisz kolejność połączeń w: - (void)sliderChanged:(UISlider*)sender

Można zadzwonić [self addCircleWithRadius:radius];

przed wywołaniem [mapView removeOverlays:[mapView overlays]];

Tylko upewnij się, że nie usunąć nakładki po prostu dodane, tylko stare .

Zapewni to płynniejszą zmianę rozmiaru, szczególnie gdy nowy okrąg jest mniejszy niż stary.

W przypadku kręgów, które są większe, prawdopodobnie lepiej jest użyć narzędzia NSOperations, aby zapewnić szybsze tworzenie widoków, co spowoduje, że będzie on gładszy.

Mam nadzieję, że to pomoże.

+0

Dobry pomysł. Dam temu szansę. Czy mógłbyś rozwinąć swoją sugestię za pomocą NSOperations? –

+0

Cieszę się, że podoba Ci się ten pomysł, jeśli chodzi o większe kręgi, wskażę przykład [breadcrumb] (http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html). – Zebs

+2

Poszukuję tutoriala 'NSOperation', do którego przyjechałem [ten jeden] (http://icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/), jest bardzo kompletny i powinien pomóc ci szybciej tworzyć obiekty 'MKCircle'. Pamiętaj tylko, że możesz zaktualizować interfejs użytkownika tylko z pętli głównego uruchomienia. – Zebs

0

Najlepszym rozwiązaniem może być samodzielne narysowanie koła za pomocą innego UIView na górze MKMapView lub za pomocą MKAnnotationView w widoku mapy.

Ten bloger zrobił podobną rzecz (przed iOS4, kiedy dodano nakładki). http://spitzkoff.com/craig/?p=65

+0

podczas przeciągania mapy UiView nie przemieszcza się wraz z mapą. – AlexWien

Powiązane problemy