Плавное изменение размера 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 ...
}
Итак, у вас есть идеи? Заранее спасибо!