我想将 UIView 转换为图像并将其保存在我的应用程序中。有人可以告诉我如何截取 View 的屏幕截图或将其转换为图像,以及将其保存在应用程序(不是相机胶卷)中的最佳方式是什么?这是 View 的代码:
var overView = UIView(frame: CGRectMake(0, 0, self.view.frame.width/1.3, self.view.frame.height/1.3))
overView.center = CGPointMake(CGRectGetMidX(self.view.bounds),
CGRectGetMidY(self.view.bounds)-self.view.frame.height/16);
overView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(overView)
self.view.bringSubviewToFront(overView)
最佳答案
UIView
的扩展应该可以解决问题。
extension UIView {
// Using a function since `var image` might conflict with an existing variable
// (like on `UIImageView`)
func asImage() -> UIImage {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
}
}
Apple 不鼓励使用 UIGraphicsBeginImageContext
从 iOS 10 开始引入 P3 色域。 UIGraphicsBeginImageContext
仅为 sRGB 和 32 位。他们引入了新的 UIGraphicsImageRenderer
API,该 API 是完全颜色管理的、基于 block 的、具有 PDF 和图像的子类,并自动管理上下文生命周期。查看WWDC16 session 205了解更多详情(图像渲染在 11:50 左右开始)
为确保它适用于所有设备,请使用 #available
回退到早期版本的 iOS:
extension UIView {
// Using a function since `var image` might conflict with an existing variable
// (like on `UIImageView`)
func asImage() -> UIImage {
if #available(iOS 10.0, *) {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
} else {
UIGraphicsBeginImageContext(self.frame.size)
self.layer.render(in:UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return UIImage(cgImage: image!.cgImage!)
}
}
}
关于ios - 如何将 UIView 转换为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696307/