在MapKit中有效地显示几个MKCircleViews

时间:2013-07-12 09:51:41

标签: ios performance overlay mapkit geometry

我正在尝试使用MapKit显示大量MKCircles。到目前为止,我已将MKCircle <MKOverlay>扩展到名为Circle的类中。我有一个只读名为circleView的属性。在getter中我构造了MKCircleView

-(MKCircleView *)circleView {
    if(!_circleView){
        _circleView = [[MKCircleView alloc] initWithOverlay:self];

        [_circleView setFillColor:self.color];
    }

    return _circleView;
}

然后,在地图中,我这样做:

- (MKOverlayView *)mapView:(MKMapView *)mapView 
            viewForOverlay:(id<MKOverlay>)overlay {
   if ([overlay isKindOfClass:Circle.class]) {
       Circle *region = overlay;

       return [region circleView];
    }

    return nil;
}

我正在从服务器加载这些圈子,但是我可以有几个圈子(在一个区域中显示超过1k)。

我觉得用户界面不够响应。即使从服务器缓存中使用圆圈,也需要一段时间来重绘它们并在该区域内移动可能会很痛苦。有没有办法改善这种表现?

修改

我发现我正在展示更多必要的圆圈,但它仍然很慢。

1 个答案:

答案 0 :(得分:0)

它不仅会影响用户界面和绘图速度,而且在地图上绘制多个叠加层会导致实际设备出现内存问题。这是由于MapKit没有重复使用叠加层。由于注释具有reuseWithIdentifier,因此覆盖不会。每个叠加层在地图上创建一个新图层MKOverlayView,其中包含叠加层。通过这种方式,内存使用量会快速上升,滚动变得......让我们说几乎不可能缓慢。

因此,有一种解决办法:您可以将MKOverlays(在您的情况下为MKCircles)中的所有MKOverlayView添加到一个MKOverlayView,而不是单独绘制每个叠加层。这样,您实际上只创建了一个{{1}},因此无需重复使用

this question中的答案包含解决方法。

我以多种MKPolygons的方式使用这种方法,效果很好。