2009-11-02 13 views
46

Tengo un UIImage que quiero dibujar en un UIView. Pero en lugar de crear un UIImageView y agregar esto como una subvista, quiero sobrescribir -drawRect: y dibujar mi UIView directamente.Cómo dibujar un UIImage o directamente en -drawRect :?

Por ejemplo, mi código es el siguiente:

- (void)drawRect:(CGRect)rect { 
    CGContextRef myContext = UIGraphicsGetCurrentContext(); 

    UIImage *img = [UIImage imageNamed:@"foo.png"]; 

    // how to draw the directly into the view now? 
} 

Respuesta

83

llamada [img drawInRect:rect];.

+4

También hay '[img drawAtPoint: point]' también, aunque prefiero 'drawInRect:'. –

+0

intenta evitar esta técnica si puedes; drawInRect y drawAtPoint tienen un rendimiento bastante terrible. – TomSwift

+1

Gracias. Encontré estos especialmente útiles (combinados con los complementos de dibujo de UIKit de NSString similares) para las vistas que contienen imágenes de fondo y texto y luego se agregaron a la vista de desplazamiento. Dibujar la imagen de fondo y el texto juntos en drawRect: evita que Quartz mezcle las capas (como lo haría si usa UIImageView y UILabel subviews) que tiene un impacto significativo en el rendimiento de desplazamiento – cidered

30

Por cierto, no debe cargar el archivo de imagen en el método drawRect. Porque se llama al método cada vez que se requiere la vista para actualizar. Por lo tanto, (por supuesto, el procedimiento de carga) se puede llamar muchas veces durante la ejecución. (Además, el método imageNamed de OS2.x tiene un error: no almacena en caché la imagen y la filtró)

Por lo tanto, será mejor que cargue el archivo en el método de inicialización, no en drawRect.

+0

Gracias por la información útil. Desafortunadamente, ¿a qué método de "inicialización" te refieres? – geforce

+0

Probablemente signifique '+ (void) initialize', o el método' init' habitual, dependiendo de lo que esté haciendo. – Mason

Cuestiones relacionadas