Cambio de tamaño suave de MKCircle

¿Cómo puedo lograr un cambio de tamaño suave de un MKCircleView en un UIMapView al ajustar un NSSlider? Apple ha logrado hacerlo en elEncuentra a mis amigos aplicación al crear geofences (http://reviewznow.com/wp-content/uploads/2013/03/find-my-friends-location-alerts-01.jpg), así que supongo que es posible de alguna manera. Hasta ahora he intentado las siguientes soluciones, pero con un resultado muy "parpadeo":

Primer intento

Agregué un nuevo MKCircleView con un radio actualizado e inmediatamente después de quitar el que estaba (como se sugiere aquí)MKOverlay no redimensiona suavemente) cuando el control deslizante cambió de valor. También intenté al revés: primero quitando la superposición y luego agregando una nueva, pero con el mismo resultado "flickery".

- (void)sliderChanged:(UISlider*)sender
{
    double radius = (sender.value * 100);
    [self addCircleWithRadius:radius];
    [mapView removeOverlays:[self.mapView.overlays firstObject]];
}

Segundo intento

En la respuesta SO vinculada, sugiere que la NSOperation podría usarse para "ayudarlo a crear los objetos MKCircle más rápido" y así hacer que el cambio de tamaño sea más suave utilizando el método anterior de agregar / eliminar superposiciones cuando las diapositivas cambian de valor. Hice una implementación donde comienzo un nuevo hilo cada vez que cambia el control deslizante. En cada hilo, elimino todas las superposiciones antiguas y añado una nueva con la escala actualizada. Tal vez él tenga algún otro tipo de implementación en mente, porque la forma en que lo hice me da el mismo parpadeo al cambiar el control deslizante.

- (void)sliderChanged:(UISlider*)sender
{
     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                             selector:@selector(updateOverlayWithScale:)
                                                                               object:[NSNumber numberWithFloat:sender.scale]];
     [self.queue addOperation:operation];
}

El método que ejecuta i cada hilo:

- (void)updateOverlayWithScale:(NSNumber *)scale
{
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:self.currentMapPin.coordinate
                                                     radius:100*[scale floatValue]];


    [self.mapView performSelectorOnMainThread:@selector(removeOverlays:) withObject:self.mapView.overlays waitUntilDone:NO];
    [self.mapView performSelectorOnMainThread:@selector(addOverlay:) withObject:circle waitUntilDone:NO];
}

Tercer intento

También intenté implementar mi propia subclase de MKOverlayView que se dibuja en función de su propiedad de escala. Cada vez que cambia el control deslizante, llamo setNeedsDisplay y permito que se vuelva a dibujar, pero obtengo el mismo parpadeo.

- (void)sliderChanged:(UISlider*)sender
{
     self.currentOverlayView.scale = sender.scale
     [self.currentOverlayView setNeedsDisplay];
}

Y en mi vista de superposición personalizada implemento drawMapRect: zoomScale: inContext: (CGContextRef) contexto como este

- (void)drawMapRect:(MKMapRect)mapRect
          zoomScale:(MKZoomScale)zoomScale
          inContext:(CGContextRef)context
{
     double radius = [(MKCircle *)[self overlay] radius];
     radius *= self.scale;

     // ... Create a rect using the updated radius and draw a circle inside it using CGContextAddEllipseInRect ...

}

Entonces, ¿tienes alguna idea? ¡Gracias por adelantado!

Respuestas a la pregunta(1)

Su respuesta a la pregunta