从UIView捕获UIImage无法正常工作

时间:2014-12-16 10:23:27

标签: ios swift uiview uiimage

我尝试使用imagecontext

UIImage抓取UIView
func captureImage() -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, 0.0)
    self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: false)
    let img = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return img
}

我也尝试过使用renderinContext()

我在extension UIView

中有这个

我使用它来从MapBoxView获取图像,这是一个子类UIView

if let viewImage = self.mapView?.resizableSnapshotViewFromRect(frame, afterScreenUpdates: false, withCapInsets: UIEdgeInsetsZero) {
    let img = viewImage.captureImage()

    self.view.addSubview(UIImageView(image: img))
}

captureImage()函数返回的img只是黑色......

当我将其添加到视图时,

viewImage有正确的内容,因此捕获方法有问题。

3 个答案:

答案 0 :(得分:0)

resizableSnapshotViewFromRect返回UIView对象,但不将此对象添加到视图层次结构中,也不显示此视图。 所以在这种情况下self.drawViewHierarchyInRect将不会得到任何东西。

为什么不直接从mapView捕获UIImage?

if let img = self.mapView?.captureImage() {
    self.view.addSubview(UIImageView(image: img))
}

答案 1 :(得分:0)

要从MapView获取快照,您还可以获得MKMapSnapshotter课程的帮助。

见以下内容:

func takeSnapShot {

    var options = MKMapSnapshotOptions()
    options.region = self.mapView.region
    options.scale = UIScreen.mainScreen().scale

    var snapshotter = MKMapSnapshotter(options: options)
    snapshotter .startWithCompletionHandler { (var snapShot: MKMapSnapshot!, var error: NSError!) -> Void in
        var image = snapShot.image as UIImage!
    }
}

修改

我已经探索过 MapBox RMMapView ,发现有一种方法可以从地图中拍摄快照。

- (UIImage *)takeSnapshot;

是的,您可以从地图的特定部分快速拍摄。类MKMapSnapshotOptions具有属性size,您可以在上面的代码中传递所需的大小。

func takeSnapShot {

    var options = MKMapSnapshotOptions()
    options.region = self.mapView.region
    options.scale = UIScreen.mainScreen().scale

    // The size of the image to create. Defaults to 256x256
    options.size = CGSizeMake(100, 100);

    var snapshotter = MKMapSnapshotter(options: options)
    snapshotter .startWithCompletionHandler { (var snapShot: MKMapSnapshot!, var error: NSError!) -> Void in
        var image = snapShot.image as UIImage!
    }
}

答案 2 :(得分:0)

将OS_VERSION的宏定义为:

#define OS_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]

要获取任何视图的快照图像,您可以使用此方法:

- (UIImage *)takeSnapshotOfView:(UIView *)view
{
    UIGraphicsBeginImageContext(view.bounds.size);

    if (OS_VERSION < 7.0)
    {
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    }
    else
    {
        [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
    }

    UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return snapshot;
}

如果您有任何问题,请与我们联系。