gpt4 book ai didi

ios - MKCircle 平滑调整大小

转载 作者:可可西里 更新时间:2023-11-01 03:21:24 25 4
gpt4 key购买 nike

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

第一次尝试

我添加了一个具有更新半径的新 MKCircleView,并在删除 slider 更改值时的那个(如此处建议的 MKOverlay not resizing smoothly )后立即添加。我也尝试了另一种方法:首先删除叠加层,然后添加一个新的叠加层,但结果仍然是“闪烁”。

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

第二次尝试

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

- (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 子类,该子类根据其缩放属性绘制自身。每当 slider 发生变化时,我都会调用 setNeedsDisplay 并让它重新绘制自己,但我得到了相同的闪烁。

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

在我的自定义叠加 View 中,我实现了 drawMapRect:zoomScale:inContext:(CGContextRef)context 这样的

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

}

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

最佳答案

几个月前我偶然发现了this animated MKCircleView .它也有一个关于 git 的演示。所以我想你应该试一试!检查一下,因为您可以使用 slider 等根据您的需要进行调整。

感谢 yickhong 提供了这个 YHAnimatedCircleView

关于ios - MKCircle 平滑调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17571332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com