我正在尝试使用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)。
我觉得用户界面不够响应。即使从服务器缓存中使用圆圈,也需要一段时间来重绘它们并在该区域内移动可能会很痛苦。有没有办法改善这种表现?
修改
我发现我正在展示更多必要的圆圈,但它仍然很慢。
答案 0 :(得分:0)
它不仅会影响用户界面和绘图速度,而且在地图上绘制多个叠加层会导致实际设备出现内存问题。这是由于MapKit没有重复使用叠加层。由于注释具有reuseWithIdentifier
,因此覆盖不会。每个叠加层在地图上创建一个新图层MKOverlayView
,其中包含叠加层。通过这种方式,内存使用量会快速上升,滚动变得......让我们说几乎不可能缓慢。
因此,有一种解决办法:您可以将MKOverlays
(在您的情况下为MKCircles
)中的所有MKOverlayView
添加到一个MKOverlayView
,而不是单独绘制每个叠加层。这样,您实际上只创建了一个{{1}},因此无需重复使用。
this question中的答案包含解决方法。
我以多种MKPolygons的方式使用这种方法,效果很好。