我正在创建SVG着色应用程序,我有一个自定义CAShapeLayer用于绘制径向渐变。在我的应用程序中,通常对于SVG,这些层大约有300个。我的代码工作正常。但是问题是,当使用draw(in ctx: CGContext)
方法向CAShapeLayer绘制渐变时,我真的很快就会耗尽内存。我想清除内存,以使应用程序不会崩溃。
这是我的自定义CAShapeLayer代码的简单版本:
import Foundation
import QuartzCore
class MyCAShapeLayer: CAShapeLayer {
public func updateLayer() {
self.fillColor = nil
self.setNeedsDisplay()
}
override func draw(in ctx: CGContext) {
ctx.saveGState()
if (self.path != nil) {
ctx.addPath(self.path!)
ctx.clip()
}
let numberOfLocations: Int = 2;
let gradientLocations: [CGFloat] = [0.0, 1.0]
let gradientComponents: [CGFloat] = [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0];
let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceRGB()
let gradient: CGGradient = CGGradient(colorSpace: colorSpace, colorComponents: gradientComponents, locations: gradientLocations, count: numberOfLocations)!
let gradientCenter: CGPoint = CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height / 2)
let gradientRadius: CGFloat = min(self.bounds.size.width, self.bounds.size.height)
ctx.drawRadialGradient(gradient, startCenter: gradientCenter, startRadius: 0, endCenter: gradientCenter, endRadius: gradientRadius / 2, options: .drawsAfterEndLocation)
ctx.restoreGState()
}
}
这是我的ViewController.swift:这不是实际的代码。但这就是渲染SVG时在幕后发生的事情。我为每个SVG元素创建一个CAShapeLayer并将其添加到视图的子层。同时,我将其存储在数组中以备将来操作。
for i in 0...35 {
let layer: MyCAShapeLayer = MyCAShapeLayer()
let rect: CGRect = CGRect(x: i * 10, y: i * 10, width: 700 - (i * 20), height: 700 - (i * 20))
let path: CGPath = CGPath(rect: rect, transform: nil)
layer.path = path
layer.fillColor = UIColor.white.cgColor
layer.strokeColor = UIColor.black.cgColor
layer.bounds = path.boundingBoxOfPath
layer.frame = layer.bounds
self.view.layer.addSublayer(layer)
self.shapeLayerList.append(layer)
}
然后在OnTap上,在每个图层上绘制渐变。
self.shapeLayerList.forEach {
shapeLayer in
shapeLayer.updateLayer()
}
这里的内存将迅速增加,并且当具有约300层时,应用程序将耗尽内存。
在绘制时是否可以管理内存?任何建议将不胜感激。