objective-c - 如何在主线程外渲染 MKMapView?

标签 objective-c ios performance mkmapview

大家好!

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

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

但是此代码仅呈现 map 的黄色背景和指定位置上方的图钉。没有街道,房屋等 map 数据。我做错了什么?谢谢你的建议。

最佳答案

您没有获得任何 map 数据的原因是您没有等待 map 数据加载。等到 map View 的 mapViewDidFinishLoadingMap: 委托(delegate)方法被调用,然后拍照。在委托(delegate)方法被调用后,您可能需要稍等一两秒后拍照,因为我发现有时委托(delegate)方法被调用得有点早,正如我在 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();
    });
}

注意:您需要将 map View 的尺寸设置为正方形,这样当您在正方形图像中渲染它时,它就不会被笨拙地拉伸(stretch)。

关于objective-c - 如何在主线程外渲染 MKMapView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731502/

相关文章:

ios - NSURLConnection 在完成所有过程后发送请求

ios - 使用自定义 init 转入 UITableViewController

objective-c - NSThread 中的 NSUrlConnection - 没有执行委托(delegate)!

ios - 在 ARKit 中获取相机的向上矢量

ios - 使用 GCD 添加 UIView

python 2.7 写 "x in set"与 "set.__contains__(x)"

ios - iPhone 4 和 5 支持的应用程序无需更改 Storyboard

javascript - 将漫画变成 iPhone 网络应用程序

javascript - 在特定页面上使用 jQuery(放在页面底部)

c# - 调用空函数需要多长时间?