Toubleshooting mapkit性能

use*_*949 8 iphone cocoa-touch objective-c mapkit

我正在使用mapkit在地图上绘制超过500个点.与原生谷歌地图应用相比,缩放有点紧张.我发现了导致缓慢的原因.我正在添加自定义注释,以便稍后可以为细节视图添加不同的引脚颜色和按钮:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(AddressNote *) annotation {
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentlocation"];
    annView.pinColor = MKPinAnnotationColorGreen;
    annView.animatesDrop=TRUE;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);
    return annView;
}
Run Code Online (Sandbox Code Playgroud)

如果我注释掉上面的代码,一切正常.放大/缩小非常流畅.我应该以不同方式添加注释以提高性能吗?

nev*_*ing 6

500注释可能太多了,但是当你只查看其中一些时,性能会受到影响.但是,您应该使用带注释的dequeueing来提高性能

- (MKAnnotationView *)mapView:(MKMapView *)mapView
            viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKPinAnnotationView *view = nil;
    if (annotation != mapView.userLocation) {
        view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"identifier"];
        if (nil == view) {
            view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"identifier"] autorelease];
        }
        [view setPinColor:MKPinAnnotationColorGreen];
        [view setCanShowCallout:YES];
        [view setAnimatesDrop:NO];
    }
    else {
        // Do something with the user location view
    }
    return view;
}
Run Code Online (Sandbox Code Playgroud)

此外,使用500个引脚,投影动画需要很长时间才能完成.你应该把它关掉[view setAnimatesDrop:NO]

  • 谢谢,但出列并没有帮助表现任何.我知道大量的注释会导致性能下降.我可以减少到100并获得良好的表现.当地图查看区域发生变化时,我需要一种方法来加载要进入视图的点的注释.需要延迟加载,但mapkit对于那种类型的东西不友好. (2认同)
  • Dequeueing确实有助于提高性能,为什么还要使用它呢?"通过避免在这个时间关键操作期间创建新的视图对象,重复使用注释视图可以在滚动期间显着提高性能." http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKAnnotationView_Class/Reference/Reference.html (2认同)

Ste*_*ntz 1

在我看来,向 iPhone 屏幕大小的地图部分添加 500 个地图点是没有意义的。您无法将其可视化,甚至无法单击正确的注释。

您不能查看地图的缩放级别和中心,然后决定仅向地图添加注释子集吗?

我想我也见过其他应用程序这样做。