iOS开发--MKMapView截图

地图控件MKMapView由于要从网络上加载地图数据并在内存中缓存,因此通常占用的内存开销特别大,特别是当用户进行放大缩小、快速拖动、3d旋转时,内存基本呈直线上升,单个地图控件占用百兆内存不成问题。

假设在一个UITableView中,每个Cell的宽度和高度分别为320、150,每个Cell中都放置一个高度为320*150的MkMapView,采用Cell重用的方式,这种情况下iPhone 4s上UITableView中将最多包含4个MkMapView。又假设这里的MkMapView仅仅用于展示,不接受用户操作,此时我们保守估计每个 MkMapView占用10M内存。基于上述两种假设,不难算出,此时地图控件占用的总内存大小为40M = 4 * 10M。40M的内存对于移动应用开发,可以算是巨大的开销了。

针对这种情况,我们提出截图的方案来有效解决这个问题。举个例子,假设UITableView显示的内容如下:

第一行:北京市地图

第二行:上海市地图

第三行:广州市地图

第四行:深圳市地图

。。。。。。。。。

第N行:某某市的地图

解决方法就是:每一行的地图在头一次加载时,当地图数据加载完成后,将该地图截图保存为图片,等列表再次滚动到该行,我们用对应的图片来替代之间的地图。下面我们来说一下详细的实现步骤。

一、截图时机

通常我们在使用MKMapView地图控件时,如常用的运动的APP,会在地图上添加一些大头针(MKAnnotation)和绘制一些线条(MKOverlay)。如果你的地图控件添加了大头针以及绘制了线条,那么正确的截图时机应该满足如下三个要求:1、地图数据加载完成;2、大头针绘制完成;3、线条绘制完成。

那么问题来了,如何判断上述三种操作的已完成?经过分析,地图数据加载和大头针绘制没错,MkMapViewDelegate提供了相应的方法,分别对应的方法为:

地图数据加载完成:

大头针绘制完成:

线条绘制完成:

二、地图截图

地图控件继承于UIView,截图的方法这里就不细讲了,直接上代码:

+ (UIImage *) imageWithUIView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

三、保存图片

保存图片时,注意图片的命名,保证图片能够对应上相应的MKMapView,如:北京.png,上海.png,广州.png,等等。保存图片的代码如下:

+ (BOOL)saveImage:(UIImage*)image WithName:(NSString*)imageName
{
    NSString *imageDir = [self getDir];
    NSString *imagePath = [imageDir stringByAppendingPathComponent:imageName];
    BOOL isCreated = [UIImagePNGRepresentation(image) writeToFile:imagePath options:NSAtomicWrite error:nil];

    return isCreated;
}

四、整体实现

- (void)doScreenshot
{
    if (_isDrawAnnotationsDone && _isRenderMapDone && _isDrawOverlayDone) {
         UIImage *mapImage = [self imageWithUIView:_mapView];
         [self saveImage:mapImage WithName:@"xx.png"];
    }
}
- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
{
    _isRenderMapDone = YES;
    [self doScreenshot];
}
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
    _isDrawAnnotationsDone = YES;
    [self doScreenshot];
}
- (void)mapView:(MKMapView *)mapView
didDeselectAnnotationView:(MKAnnotationView *)view{
    _bDrawOverlayDown = YES;
   [self doScreenshot];
}
时间: 2024-11-07 11:46:32

iOS开发--MKMapView截图的相关文章

iOS开发--MKMapView添加UIPanGestureRecognizer

当我们想给MKMapView添加拖动手势时,第一个想法可能是这样: - (void)viewDidLoad { //.... UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [self.mapView addGestureRecognizer:panGesture]; } - (void)handlePan

李洪强iOS开发之苹果使用预览截图

李洪强iOS开发之苹果使用预览截图 01 在预览的图片中选中你要截得区域  02 - command + C   03 - Command + N 04 - Command + S (保存)

iOS开发之使用XMPPFramework实现即时通信

iOS开发之使用XMPPFramework实现即时通信 关于XMPP的理论介绍在本篇博客中就不做赘述了,如何在我们之前的微信中加入XMPP协议来实现通信呢?下面将会介绍一下XMPP的基本的知识,让我们的微信可以实现互联通信.要做的准备工作是要有服务器支持XMPP协议,然后通过spark注册个测试账号,最后就可以通过XMPP用我们已有的账号和密码进行通信啦.至于如何使服务器支持XMPP协议,如何通过Spark注册账号,不是本篇博客的论述主题,本篇博客中主要是如何在我们的App中使用XMPP协议.

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 转载:http://www.cnblogs.com/kenshincui/p/4186022.html#avFoundationCamera --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音

iOS开发 定位服务与地图

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

IOS开发--数据持久化篇之文件存储(一)

前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不胜感激. 什么叫数据持久化: 在这里我就不照搬教科书上抽象的概念了.我觉得既然要把东西写出来就让它简单明了. 要搞清楚数据持久化,首先要知道数据持久化是相对于缓存而言的,缓存是在程序运行的过程中保存在内存中,程序一旦运行结束,其内存就会被释放.缓存在内存中的数据也就随之消失. 那么数据持久化就是要解

**iOS开发系列--IOS程序开发概览

http://www.cnblogs.com/kenshincui/p/3890880.html 概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的知识是你日后开发IOS的基础,没有那些知识你开发IOS会很痛苦,现在很多开发人员做开发都是一知半解,程序质量确实令人担忧,所以还是希望大家能够熟练掌握前面的内容,开发过程中多思考,彻底理解程序运行的原理

【IOS】Mac和IOS开发资源汇总

本文主要汇集一些苹果开发的资源,会经常更新,建议大家把这篇文章单独收藏(在浏览器中按**command+D**). 今天收录了许多中文网站和博客.大家一定要去感受一下哦. 如果大家有知道不错的站点,可以告诉我.  目录 1.苹果官方文档 2.邮件列表 3.论坛 4.网站 5.博客 6.大会 7.播客和录像 正文 1.苹果官方文档 构建iOS程序:下面的这篇文章介绍了 iOS 程序开发的过程: Start Developing iOS Apps Today 构建Mac OS X程序:下面这篇文章介

一些常用的IOS开发网站

开发教程: 即便过了入门阶段,还是要经常看看一些不错的实例教程.1.http://mobile.tutsplus.com/category/tutorials/iphone/ 比较新的一个网站,以前没注意到.其中有一篇文章着重推荐,学习iOS游戏开发可以参考的10个实例(源代码都在github上):http://mobile.tutsplus.com/tutorials/iphone/learn-ios-game-development-by-example-10-projects-to-get