我在
UIView
中有水平 ScrollView
和一些大尺寸图像。我想分割为特定尺寸,例如旋转木马柱。
但是,当我执行该函数时,由于内存不足,它使应用程序崩溃。我检查了一下,当我渲染预览时,它使用大量内存。
我使用以下代码从视图生成图像。
func generatePreviewImages() -> [UIImage] {
let arrMaskView = properties.arrAllObjectView.filter({ ($0 as? MaskView) != nil }) as? [MaskView] ?? [MaskView]()
arrMaskView.forEach({ $0.imageViewAddIcon.isHidden = true })
var arrImage = [UIImage]()
for i in 0..<Int(properties.cols) {
autoreleasepool(invoking: {
let x = (viewCanvas.frame.size.width / properties.cols.cgFloat) * CGFloat(i)
let width = (viewCanvas.frame.size.width / properties.cols.cgFloat)
if let image = viewCanvas.asImage(bounds: CGRect.init(x: x, y: 0, width: width, height: viewCanvas.bounds.height)) {
arrImage.append(image)
}
})
}
arrMaskView.forEach({ $0.imageViewAddIcon.isHidden = !($0.imageUser == nil) })
return arrImage
}
对于从 UIView 转换的图像
func asImage(bounds:CGRect) -> UIImage? {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
}
您的代码将所有图像保存在一个数组中,这是内存压力的主要原因。图像是在内存(RAM)中创建的,这就是您在这里收到内存警告的原因。
您所能做的就是,在 for 循环中创建图像后,将创建的图像保存到磁盘内存中,即文档目录或其他位置,并将保存图像的文件 url 保存到数组中。稍后您可以从磁盘内存加载图像并可以在任何您想要的地方使用。
希望这能解决您的问题!!!