平滑调整MKCircle

在调整NSSlider时,如何在UIMapView上顺利调整MKCircleView的大小? 在创build地理围栏时,苹果已经在“ 查找我的朋友”应用中做到了这一点,所以我想这是可能的。 到目前为止,我已经尝试了下面的解决scheme,但是有一个非常“闪烁”的结果:

第一次尝试

我添加了一个新的MKCircleView具有更新的半径,并立即删除(当在这里build议MKOverlay不顺利resize )当滑块更改值后。 我也尝试了另一种方式:首先删除覆盖,然后添加一个新的,但具有相同的“flickery”结果。

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

第二次尝试

在链接的SO答案中,他build议NSOperation可以用来“帮助你更快地创buildMKCircle对象”,从而在幻灯片更改值时使用上述添加/删除叠加的方法使调整更平滑。 我做了一个实现,当滑块更改时,我开始一个新的线程。 在每个线程中,我删除所有旧的覆盖,并添加一个新的更新的比例。 也许他还有一些其他的实现方式,因为我做这件事的方式在更改滑块时仍然会有相同的闪烁。

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

第三次尝试

我也尝试实现我自己的基于其scale属性绘制自己的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 ... } 

那么,你有什么想法吗? 提前致谢!

几个月前,我偶然发现了这个animationMKCircleView 。 它也有一个Git的演示。 所以我想你应该放弃它! 检查一下,因为你可以用slider等来调整它的需要

积分去yickhong提供这YHAnimatedCircleView