Плавное изменение размера MKCircle

Как можно добиться плавного изменения размера MKCircleView на UIMapView при настройке NSSlider? Apple удалось сделать это вНайди моих друзей приложение при создании геозон (http://reviewznow.com/wp-content/uploads/2013/03/find-my-friends-location-alerts-01.jpg), так что я думаю, этоВозможно каким-то образом. Пока ямы пробовали следующие решения, но с оченьflickery» результат:

Первая попытка

Я добавил новый MKCircleView с обновленным радиусом и сразу после удаления того, который был (как предложено здесьMKOverlay не изменяет размер плавно) когда ползунок изменил значение. Я также попробовал наоборот: сначала убрав оверлей, затем добавив новый, но с тем жеflickery» результат.

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

Вторая попытка

В связанном ответе SO он предлагает использовать NSOperation для "поможет вам быстрее создавать объекты MKCircle » и, таким образом, делая изменение размера более плавным, используя вышеуказанный способ добавления / удаления наложений, когда слайды изменяют значение. Я сделал реализацию, где я начинаю новый поток всякий раз, когда меняется слайдер. В каждой теме я удаляю все старые наложения и добавляю новую с обновленным масштабом. Возможно, он имеет в виду какой-то другой вид реализации, потому что, когда я это сделал, я все еще чувствую то же мерцание при смене слайдера.

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

Метод, который запускает каждый поток:

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

Третья попытка

Я также попытался реализовать свой собственный подкласс MKOverlayView, который рисует сам на основе его свойства масштаба. Всякий раз, когда ползунок меняется, я вызываю setNeedsDisplay и позволяю ему перерисовываться, но я получаю то же мерцание.

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

И в моем собственном представлении наложения я реализую контекст drawMapRect: zoomScale: inContext: (CGContextRef) следующим образом

- (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 ...

}

Итак, у вас есть идеи? Заранее спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос