我尝试使用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
有正确的内容,因此捕获方法有问题。
答案 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;
}
如果您有任何问题,请与我们联系。