MKOverlay大小调整不平滑

22
我已将MKCircle作为MKOverlay添加到了我的MKMapView中。同时,我添加了一个UISlider来决定圆形的半径。不幸的是,在使用它时,它似乎有一些"延迟",不像我想要的那样平滑流畅。
示例: http://dl.dropbox.com/u/3077127/mkoverlayDelay.mov 以下是我的代码:
- (void)addCircle
{
    // draw the radius circle for the marker
    double radius = 2000.0;
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:location radius:radius];
    [circle setTitle:@"background"];
    [mapView addOverlay:circle];

    MKCircle *circleLine = [MKCircle circleWithCenterCoordinate:location radius:radius];
    [circleLine setTitle:@"line"];
    [mapView addOverlay:circleLine];
}

- (void)addCircleWithRadius:(double)radius
{
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:location radius:radius];
    [circle setTitle:@"background"];
    [mapView addOverlay:circle];

    MKCircle *circleLine = [MKCircle circleWithCenterCoordinate:location radius:radius];
    [circleLine setTitle:@"line"];
    [mapView addOverlay:circleLine];
}

- (void)sliderChanged:(UISlider*)sender
{
    [mapView removeOverlays:[mapView overlays]];

    double radius = (sender.value * 100);

    [self addCircleWithRadius:radius];
}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay{
    MKCircle *circle = overlay;
    MKCircleView *circleView = [[[MKCircleView alloc] initWithCircle:overlay] autorelease];

    if ([circle.title isEqualToString:@"background"])
    {
        circleView.fillColor = UIColorFromRGB(0x598DD3);
        circleView.alpha = 0.25;
    }
    else
    {
        circleView.strokeColor = UIColorFromRGB(0x5C8AC7);
        circleView.lineWidth = 2.0;
    }

    return circleView;
}

有人有关于如何使这个更加顺畅的建议吗?

最好的问候,
保罗·皮伦


1
+1 给一个很好文档的问题。有必要移除覆盖图层吗?为什么不直接更新它呢? - sudo rm -rf
谢谢!我不认为有必要,但是我该如何更新覆盖层? - Paul Peelen
我不确定你是否能够这样做?我一直认为MapKit叠加层是不可变的,创建后不能修改。这个答案也表明了同样的观点:https://dev59.com/0nA75IYBdhLWcg3wqK__ - lxt
好的,感谢您的评论。无论如何,我正在寻找平滑处理这个问题...有什么想法吗? - Paul Peelen
2个回答

6
我已经尝试了你的代码,并发现一种更简单的方法使其更加流畅。
如果你改变调用顺序:- (void)sliderChanged:(UISlider*)sender
你可以在调用[mapView removeOverlays:[mapView overlays]];之前调用[self addCircleWithRadius:radius]; 只需确保不要删除刚添加的覆盖物,而是只删除旧的覆盖物。
这将使你的调整大小更加平滑,特别是当新圆比旧圆小的时候。
对于更大的圆,你最好使用NSOperations来确保视图更快地创建,这将使其更加流畅。
希望这能帮到你。

好主意。我会尝试一下。您能详细解释一下关于NSOperations的建议吗? - Paul Peelen
很高兴你喜欢这个想法,关于更大的圆圈,我建议你参考Breadcrumb示例。 - Zebs
2
在寻找NSOperation教程时,我发现了这个,它非常完整,应该能帮助您更快地创建MKCircle对象。只需记住,您只能从主运行循环更新用户界面。 - Zebs
@Zebs的链接已损坏。 - Johann Burgess

0

你最好的选择可能是自己画圆,可以使用另一个UIView放在MKMapView上面,或者在地图视图中使用MKAnnotationView。

这位博主在iOS4之前做过类似的事情(当时还没有添加覆盖物)。 http://spitzkoff.com/craig/?p=65


在地图拖动期间,UiView不会随着地图移动。 - AlexWien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接