2011-02-02 9 views
21

He agregado un MKCircle como MKOverlay a mi MKMapView. También agregué un UISlider para decidir el radio del círculo. Desafortunadamente, al usar esto, parece un poco "lento", no es tan suave como quiero que sea.MKOverlay sin redimensionamiento sin problemas

Ejemplo: http://dl.dropbox.com/u/3077127/mkoverlayDelay.mov

Este es mi código:

- (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; 
} 

¿Alguien tiene alguna sugerencia sobre cómo puedo suavizar esto?

Saludos,
Paul Peelen

+1

+1 para pregunta muy bien documentada. ¿Hay alguna necesidad de eliminar la superposición, por qué no simplemente actualizarlo? –

+0

Gracias! No creo que haya ninguna necesidad ... ¿pero cómo puedo actualizar la superposición? –

+0

No estoy seguro de que puedas? Siempre pensé que las superposiciones de MapKit eran inmutables, no puedes modificarlas una vez creadas. Esta respuesta sugiere lo mismo: http://stackoverflow.com/questions/3171572/how-to-update-mkpolyline-mkpolylineview – lxt

Respuesta

5

me han tratado su código y encontró una manera muy fácil para que sea más suave.

Si cambia el orden de las llamadas en: - (void)sliderChanged:(UISlider*)sender

Usted puede llamar [self addCircleWithRadius:radius];

antes de llamar [mapView removeOverlays:[mapView overlays]];

Sólo asegúrese de que usted no quite las superposiciones que acaba de agregar, sólo los viejos .

Esto le dará un cambio de tamaño más suave, especialmente cuando el nuevo círculo es más pequeño que el anterior.

Para los círculos que son más grandes, es probable que sea mejor utilizar NSOperations para garantizar que las vistas se crean más rápido, esto lo hará más suave.

Espero que esto ayude.

+0

Buena idea. Lo probaré. ¿Podría elaborar su sugerencia con NSOperations? –

+0

Me alegra que le guste la idea, con respecto a los círculos más grandes, le indicaría el ejemplo [Breadcrumb] (http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html). – Zebs

+2

Buscando un tutorial 'NSOperation' Vine por [este] (http://icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/), es muy completo y debería ayudarte a crear los objetos 'MKCircle' más rápido. Solo recuerde que solo puede actualizar la interfaz de usuario desde el ciclo de ejecución principal. – Zebs

0

Lo mejor que puede hacer es dibujar el círculo usted mismo, ya sea usando otra UIView en la parte superior de MKMapView, o usando una MKAnnotationView dentro de la Vista de mapa.

Este blogger ha hecho algo similar (antes de iOS4 cuando se agregaron superposiciones). http://spitzkoff.com/craig/?p=65

+0

durante un arrastre de mapa, UiView no se mueve con el mapa. – AlexWien

Cuestiones relacionadas