如何在主线程外部渲染MKMapView?

时间:2012-12-05 20:07:22

标签: objective-c ios performance mkmapview

大家好日子!

我正在为iPhone开发应用程序。我有表格视图和我需要向用户显示的位置列表。为此,我在每个表视图单元格中使用了MKMapView。但是当有很多地方时,这个解决方案变得非常缓慢。我想提高UI性能并用UIImageView替换MKMapView。所以我需要在一些非MAIN线程中将地图从MKMapView渲染到UIImage。我试着这样做:

UIGraphicsBeginImageContext(CGSizeMake(64, 64));
CGContextRef context = UIGraphicsGetCurrentContext();
[[mapView layer] renderInContext:context];
thumbnail_image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

但是这段代码只渲染了地图的黄色背景和指定位置上方的图钉。没有地图数据,如街道,房屋等。我做错了什么?谢谢你的建议。

1 个答案:

答案 0 :(得分:3)

您没有获得任何地图数据的原因是您没有等待加载地图数据。等到调用地图视图的mapViewDidFinishLoadingMap:委托方法,然后拍照。在调用委托方法之后,您可能需要在一两秒钟之后拍摄照片,因为我发现有时委托方法会在我this question中提及时提前调用。

- (void)mapViewDidFinishLoadingMap:(MKMapView*)mapView {
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        UIGraphicsBeginImageContext(CGSizeMake(64, 64));
        CGContextRef context = UIGraphicsGetCurrentContext();
        [mapView.layer renderInContext:context];
        thumbnail_image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    });
}

注意:您需要将地图视图的尺寸设为正方形,这样当您在方形图像中渲染时,它就不会被拉伸。