ios - 如何将 UIView 转换为图像

标签 ios swift uiview screenshot

我想将 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/

相关文章:

ios - 在 iOS 共享扩展中创建文本字段

android - CSS Media Query Landscape - 键盘问题

swift - NSURL 错误 - 文件不存在

ios - 从公共(public)类加载表格 View

ios - UITableView Header Override (UIView) 滚动行为异常

ios - 将自定义 View 边界转换为框架坐标 - iOS Swift

iOS防止tableview的 subview 与tableview一起滚动

iphone - "Deployment Target"的作用不仅仅是控制编译器警告吗?

ios - 如何在touchesMoved :?中获取最低View

ios - 访问 plist 数组 Swift XCode