2012-06-18 14 views
15

En mi carpeta de recursos IOS, tengo las imágenes:¿Cómo NSBundle pathForResource: ofType: y UIImage imageWithContentsOfFile: manejan los modificadores de báscula y dispositivo?

foo~iphone.png 
[email protected]~iphone.png 
foo~ipad.png 
[email protected]~ipad.png 

que cargarlos con:

NSString *fileName = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"png"]; 
UIImage *image = [UIImage imageWithContentsOfFile:fileName]; 

Experimentalmente:

En el iPhone, filename es /path/to/bundle/foo~iphone.png, y en la retina iPhone, carga la versión @2x.

En el iPad, filename es /path/to/bundle/foo~ipad.png, y en la retina iPad, carga la versión @2x.

Es decir, carga la imagen que espero, pero pathForResource maneja el modificador del dispositivo, y imageWithContentsOfFile maneja el modificador de escala.

Me gustaría saber por qué. El documentation de pathForResource no dice nada sobre los modificadores del dispositivo, y el documentation de imageWithContentsOfFile no dice nada sobre los modificadores de escala.

¿Hay documentación separada que indique con precisión qué hace cada función?

+0

¿Qué valor ¿está sujetando su cadena fileName cuando establece un bp en la línea UIImage? En otras palabras, ¿cómo sabe que la escala está ocurriendo dentro de la imagenWithContentsOfFile? –

+0

@MarkM, como dije, en el iPhone, 'filename' es'/path/to/bundle/foo ~ iphone.png', así que sé que solo está obteniendo el nombre de la versión que no es @ 2x. Cuando este nombre se ingresa en 'UIImage', obtengo la versión de alta resolución. –

Respuesta

14

La explicación de imageWithContentsOfFile está en related documentation, no en la documentación UIImage sí:

En los dispositivos con pantallas de alta resolución, la imageNamed :, imageWithContentsOfFile :, y initWithContentsOfFile: métodos busca automáticamente una versión de la imagen solicitada con el modificador @ 2x en su nombre. Si encuentra uno, carga esa imagen en su lugar. Si no proporciona una versión de alta resolución de una imagen determinada, el objeto de imagen aún carga una imagen de resolución estándar (si existe) y la escala durante el dibujo.

Cuando carga una imagen, un objeto UIImage establece automáticamente las propiedades de escala y tamaño en los valores adecuados en función del sufijo del archivo de imagen. Para imágenes de resolución estándar, establece la propiedad de escala en 1.0 y establece el tamaño de la imagen en las dimensiones de píxeles de la imagen. Para imágenes con el sufijo @ 2x en el nombre de archivo, establece la propiedad de escala en 2.0 y reduce a la mitad los valores de ancho y alto para compensar el factor de escala. Estos valores se correlacionan correctamente reducido a la mitad a las dimensiones basadas en puntos que necesita para utilizar en la lógica espacio de coordenadas para representar la imagen."

No sé qué documentos se explica el comportamiento de pathForResource.

+0

. documentación. No puedo parecer para encontrar en cualquier lugar, ya sea en la documentación general de 'UIImage' o en la documentación específica de' imageWithContentsOfFile' que habla de escalado. –

+0

Y también me interesa saber por qué 'pathForResource' maneja el modificador del dispositivo. –

+0

Mi respuesta se ha actualizado para incluir citas de la documentación que hablan sobre los diferentes métodos de UIImage y por qué sus acciones hacen lo que hacen.También hay discusión sobre el modificador del dispositivo allí. Si está buscando más información al respecto, recomendaría los videos de la WWDC, ya que brindan ejemplos y la implementación de todas estas técnicas. –

Cuestiones relacionadas