es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se compara UIGraphicsImageRendererFormat?

Quiero cachear UIGraphicsImageRenderer y devolver el renderer en caché si lo utilicé antes para ese CGRect y UIGraphicsImageRendererFormat.

Intenté:

  1. UIGraphicsImageRendererFormat == UIGraphicsImageRendererFormat
  2. UIGraphicsImageRendererFormat.isEqual(UIGraphicsImageRendererFormat)

Pero ambas formas siempre devuelven false.

¿Alguna idea o solución alternativa?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución es crear un diccionario de caché donde se pueden almacenar los renderizadores utilizados previamente para un CGRect específico y un UIGraphicsImageRendererFormat. Las claves del diccionario podrían ser una combinación del origen y tamaño del CGRect, y las propiedades del formato como escala, límites y opacidad. Aquí tienes una implementación de ejemplo:

    class RendererCache {
        static let shared = RendererCache()
    
        private var cache = [String: UIGraphicsImageRenderer]()
    
        func getImageRenderer(for rect: CGRect, format: UIGraphicsImageRendererFormat) -> UIGraphicsImageRenderer {
            let key = "\(rect.origin.x)-\(rect.origin.y)-\(rect.size.width)-\(rect.size.height)-\(format.scale)-\(format.bounds)-\(format.opaque)"
            if let cachedRenderer = cache[key] {
                return cachedRenderer
            } else {
                let newRenderer = UIGraphicsImageRenderer(bounds: rect, format: format)
                cache[key] = newRenderer
                return newRenderer
            }
        }
    }
    

    Luego puedes usar esta caché en tu código de la siguiente manera:

    let format = UIGraphicsImageRendererFormat.default()
    let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
    
    let renderer = RendererCache.shared.getImageRenderer(for: rect, format: format)
    let image = renderer.image { (context) in
        // dibujar algo...
    }
    

    La primera vez que llames a getImageRenderer, creará un nuevo renderizador y lo añadirá a la caché. Llamadas posteriores con los mismos parámetros devolverán el renderizador en caché, evitando asignaciones innecesarias.

Comments are closed.