首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将MKMapSnapshotter保持为内存中的NSData --快速

将MKMapSnapshotter保持为内存中的NSData --快速
EN

Stack Overflow用户
提问于 2014-08-24 12:25:45
回答 1查看 2.5K关注 0票数 4

我在试着拍一张MKMapView的截图。我通常使用目标C中的以下代码实现这一点。

我想知道如何将NSData对象保存在内存中,而不是保存图像,然后立即读取。

我还想知道如何用Swift编写它--特别是完成处理程序部分。我看过这些文档--但不确定语法:ref/c/tdef/MKMapSnapshotCompletionHandler

代码语言:javascript
复制
MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
options.region = self.mapView.region;
options.size = self.mapView.frame.size;
options.scale = [[UIScreen mainScreen] scale];

NSURL *fileURL = [NSURL fileURLWithPath:@"path/to/snapshot.png"];

MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
[snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
    if (error) {
        NSLog(@"[Error] %@", error);
        return;
    }

    UIImage *image = snapshot.image;
    NSData *data = UIImagePNGRepresentation(image);
    [data writeToURL:fileURL atomically:YES];
}];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-24 13:27:10

在“保持”内存方面,您可以通过Objective完成块(或Swift闭包)返回NSData。从那里,您可以将NSData传递给另一个方法,也可以将它保存在类属性中。

例如,在目标C中:

代码语言:javascript
复制
/** Request NSData of PNG representation of map snapshot.
 *
 * @param mapView The MKMapView for which we're capturing the snapshot
 * @param completion The completion block that will be called when the asynchronous snapshot is done. This takes two parameters, the resulting NSData upon success and an NSError if there was an error.
 */

- (void)requestSnapshotDataForMapView:(MKMapView *)mapView completion:(void (^)(NSData *data, NSError *error))completion
{
    MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
    options.region = mapView.region;
    options.size = mapView.frame.size;
    options.scale = [[UIScreen mainScreen] scale];

    MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
    [snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
        if (error) {
            if (completion) {
                completion(nil, error);
            }
            return;
        }

        UIImage *image = snapshot.image;
        NSData *data = UIImagePNGRepresentation(image);
        if (completion) {
            completion(data, nil);
        }
    }];
}

- (IBAction)didTouchUpInsideButton:(id)sender
{
    [self requestSnapshotDataForMapView:self.mapView completion:^(NSData *data, NSError *error) {
        if (error) {
            NSLog(@"requestSnapshotDataForMapView error: %@", error);
            return;
        }

        // do whatever you want with the `data` parameter here, for example,
        // if you had some `@property (nonatomic, strong) NSData *snapshotData;`,
        // you might do:
        //
        // self.snapshotData = data

        // now initiate the next step of the process in which you're presumably
        // going to use the `data` provided by this block.
    }];
}

Swift相当于:

代码语言:javascript
复制
/// Request NSData of PNG representation of map snapshot.
///
/// - parameter mapView:     The MKMapView for which we're capturing the snapshot
/// - parameter completion:  The closure that will be called when the asynchronous snapshot is done. This takes two parameters, the resulting NSData upon success and an NSError if there was an error.

func requestSnapshotData(mapView: MKMapView, completion: (NSData?, NSError?) -> ()) {
    let options = MKMapSnapshotOptions()
    options.region = mapView.region
    options.size = mapView.frame.size
    options.scale = UIScreen.mainScreen().scale

    let snapshotter = MKMapSnapshotter(options: options)
    snapshotter.startWithCompletionHandler() { snapshot, error in
        guard snapshot != nil else {
            completion(nil, error)
            return
        }

        let image = snapshot!.image
        let data = UIImagePNGRepresentation(image)
        completion(data, nil)
    }
}

@IBAction func didTouchUpInsideButton(sender: AnyObject) {
    requestSnapshotData(mapView) { data, error in
        guard data != nil else  {
            print("requestSnapshotData error: \(error)")
            return
        }

        // do whatever you want with the `data` parameter here, for example,
        // if you had some `var snapshotData: NSData?` class property, you might do:
        //
        // self.snapshotData = data

        // now initiate the next step of the process in which you're presumably
        // going to use the `data` provided by this closure.
    }
}

坦率地说,如果您试图在其他地方使用UIImage,我可能会将这些块/闭包参数更改为使用UIImage而不是NSData,但希望这说明了这个想法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25471657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档