首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MKCircle的平滑调整

MKCircle的平滑调整
EN

Stack Overflow用户
提问于 2013-07-10 13:01:48
回答 1查看 2.9K关注 0票数 9

如何在调整MKCircleView时在UIMapView上实现NSSlider的平滑调整?苹果在创建地理信息(http://reviewznow.com/wp-content/uploads/2013/03/find-my-friends-location-alerts-01.jpg)时成功地在“查找我的朋友”应用程序中做到了这一点,所以我想在某种程度上这是可能的。到目前为止,我已经尝试了以下解决方案,但结果非常“闪烁”:

第一次尝试

我添加了一个具有更新半径的新MKCircleView,并在删除滑块更改值时(如这里建议的MKOverlay不平滑地调整大小)之后立即添加了一个新的radius。我也尝试了相反的方法:首先删除覆盖,然后添加一个新的,但具有相同的“闪烁”结果。

代码语言:javascript
复制
- (void)sliderChanged:(UISlider*)sender
{
    double radius = (sender.value * 100);
    [self addCircleWithRadius:radius];
    [mapView removeOverlays:[self.mapView.overlays firstObject]];
}

第二次尝试

在链接“所以答案”中,他建议可以使用NSOperation“帮助您更快地创建MKCircle对象”,从而使用上述在幻灯片更改值时添加/删除覆盖的方法使调整大小更加平滑。我做了一个实现,每当滑块发生变化时,我就启动一个新线程。在每个线程中,我删除所有旧的覆盖,并添加一个新的与更新的比例。也许他有一些其他的实现,因为我这样做,我仍然得到相同的闪烁时,改变滑块。

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

运行每个线程的方法:

代码语言:javascript
复制
- (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,让它自己重新绘制,但是我会看到同样的闪烁。

代码语言:javascript
复制
- (void)sliderChanged:(UISlider*)sender
{
     self.currentOverlayView.scale = sender.scale
     [self.currentOverlayView setNeedsDisplay];
}

在我的自定义覆盖视图中,我实现了这样的drawMapRect:zoomScale:inContext:(CGContextRef)context

代码语言:javascript
复制
- (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 ...

}

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

EN

回答 1

Stack Overflow用户

发布于 2013-07-12 16:20:21

几个月前,我偶然发现了这个动画MKCircleView。它也有一个关于git的演示。所以我想你应该试一试!检查它,因为您可能能够调整它,以满足您的需要与slider等。

提供此YHAnimatedCircleView的学分归yickhong所有

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17571332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档