调整NSSlider时,如何在UIMapView上平滑调整MKCircleView的大小?在创建地理围栏(http://reviewznow.com/wp-content/uploads/2013/03/find-my-friends-location-alerts-01.jpg)时,Apple已经设法在查找我的朋友应用程序中执行此操作,因此我想这在某种程度上是可行的。到目前为止,我已经尝试了以下解决方案,但结果非常“闪烁”:
首次尝试
我添加了一个更新半径的新MKCircleView,并在滑块更改值后立即删除了(如此处MKOverlay not resizing smoothly建议的那个)。我也尝试过另一种方法:首先删除叠加层,然后添加一个新叠加层,但使用相同的“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子类,它根据scale属性绘制自己。每当滑块改变时,我调用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 ...
}
那么,你有什么想法吗?提前谢谢!
答案 0 :(得分:0)
几个月前,我偶然发现this animated MKCircleView。它还有一个关于git的演示。所以我想你应该试一试!
检查一下,因为您可以使用slider
等来调整它以满足您的需求。
致信yickhong提供此YHAnimatedCircleView