2010-10-01 17 views
14

Quiero mostrar tantas imágenes en las celdas de la tabla. Conocía dos métodos para mostrar una imagen.¿cuál es la diferencia entre UIImageView y drawInRect?

Uno es la creación de una instancia de UIImageView y mostrarla

CGRect rect=CGRectMake(x,y,width,height); 
UIImageView *image=[[UIImageView alloc]initWithFrame:rect]; 
[image setImage:[UIImage imageNamed:@"sample.jpg"]]; 

Otro método es,

CGRect rect=CGRectMake(x,y,width,height); 
[[UIImage imageNamed:@"sample.jpg"] drawInRect:rect]; 

Ahora, mi pregunta es, ¿cuál es la diferencia entre estos dos? ¿Cuál es eficiente? ¿O alguna otra función está disponible mejor que esto?

Gracias de antemano ....

Respuesta

33

Al utilizar el método drawInRect:, CoreGraphics dibuja la imagen en el CGContext activo usando la CPU. Suponiendo que está en el método UIViewdrawRect:, esto pintará la imagen en el búfer de la vista.

UIImageView utiliza la imagen que se le asigna, ya que es el búfer de respaldo en lugar de utilizar el drawRect: más lento. La GPU hace referencia a este búfer directamente cuando la pantalla se compone a través de QuartzCore.

+0

+1 por una GRAN respuesta. He estado tratando de entender la distinción entre esos dos desde hace un tiempo. Así que 'UIImageView' es siempre el camino a seguir, entonces? ¿Hay casos en los que sea preferible 'drawRect:''ing la imagen directamente? –

+0

La única situación en la que puedo ver que es más lento es cuando se compone una escena de fondo estática de muchas imágenes pequeñas y luego se anima el contenido encima sin cambiar el fondo. En ese caso, la GPU tendrá que recomponer tanto el contenido móvil en la parte superior como la escena de fondo completa de cada cuadro. Este es un caso de esquina, por supuesto. – rpetrich

+3

Una situación en la que '-drawRect:' es una ventaja es cuando quieres un rendimiento de desplazamiento suave y tienes PNG que tienen transparencia. En hardware antiguo, la GPU no puede manejar el desplazamiento de una gran cantidad de vistas transparentes al mismo tiempo sin soltar marcos. Una forma de evitar esto es hacer toda su composición en '-drawRect:', que convierte este pesado trabajo de GPU en un trabajo pesado de CPU una sola vez. Este es un escenario relativamente común en las celdas con gráficos de tablas intensas, aunque no es un gran problema con el iPhone 4 y el iPad debido a las GPU más rápidas. –

0

UIImageView es una subclase UIView. Al agregarlo a la jerarquía de vistas obtiene todos los beneficios gratuitos: animaciones, propiedades de tamaño, transoforms afines, etc. Además, puede cambiar el UIImage subyacente en cualquier momento que desee.

Por otro lado, al llamar a drawInRect: simplemente dibujará la imagen donde la indique, pero no interactuará con la jerarquía UIView, por lo que no obtendrá ninguno de los beneficios de tenerla en la jerarquía de vista.

Pensaría (no lo he probado), que dibujar la imagen directamente es más rápido, pero creo que en la mayoría de los casos tener una UIImageView es una mejor idea.

+0

Por extraño que parezca, dibujar la imagen es más lento porque es menos directo que asignarlo a un 'UIImageView' – rpetrich

+0

¡Es genial saberlo, gracias! – pgb

+0

Gracias por sus valiosas respuestas –

Cuestiones relacionadas