Usa diferentes resoluciones de image para diferentes dispositivos iOS.

Tengo una image que me gustaría mostrar en mi aplicación iOS. Para conservar la memory, me gustaría mostrar la resolución más baja posible que aún coincida con la cantidad de píxeles físicos en el dispositivo

Por ejemplo, podría mostrarse como un cuadrado 1/4 de la altura del dispositivo. Entonces, los tamaños serían los siguientes

iPhone 4s 240×240 px

iPhone 5 / 5s 284×284 px

iPhone 6 334×334 px

iPhone 6+ 480×480 px

Analicé los catálogos de activos, pero no veo ninguna forma de tener una image diferente para iPhone 4s, iPhone 5 / 5s y iPhone 6 (son @2x ). La única diferencia es iPhone 6+ ( @3x ).

También intenté agregar la opción Retina 4 2x , pero eso solo da un ícono diferente para iPhone 5 / 5s, todavía no hay forma de diferenciar entre 4s y 6s.

introduzca la descripción de la imagen aquí

Entiendo que podría elegir la image programáticamente basada en el dispositivo, pero los catálogos de activos solo descargan las imágenes necesarias para el dispositivo de los usuarios (aunque no estoy seguro de si eso es cierto, recuerdo haber leído algo al respecto), haciendo que la aplicación ocupe less almacenamiento. Sería ineficiente include cuatro imágenes, si solo se utilizará una.

¿Hay alguna forma de utilizar una resolución de image diferente para cada dispositivo iOS con una cantidad diferente de píxeles físicos?

Tenga en count que no estoy preguntando sobre la escala de la image, sino sobre cómo get la resolución correcta (una image diferente para cada dispositivo), por lo que se tomará less RAM cuando se muestre.

Terminé de crear un file diferente para cada dispositivo, y dándoles nombre imageName@size , así que para una image de un perro que es 128x128 , el file se llamaría dog@128 .

Aquí está el código que solía hacer

 func getPNGImageForSize(size: Float, named: String) -> UIImage?{ //the image size will be measunetworking in points, which is the unit that is used //when setting the frames of UIViews. To turn this into pixels, it must be //multiplied by the screen's render scale (on an iPhone 6+, 1 point is equal //to 3 pixels, or 9 pixels in 2 dimensions (3^2). let scaled: Int = Int(ceil(size * Float(UIScreen.mainScreen().scale)) let imageName: String = "\(named)@\(scaled)" //ofType set to png, because this image is a PNG let path = NSBundle.mainBundle().pathForResource(imageName, ofType: "png") return UIImage(contentsOfFile: (path ?? "")) } 

Y para llamarlo, simplemente uso

 getPNGImageForSize(Float(self.view.frame.height / 4), named: "dog") 

lo que daría como resultado las siguientes imágenes, según el dispositivo

iPhone 4s dog@240.png

iPhone 5 / 5s dog@284.png

iPhone 6 dog@334.png

iPhone 6+ dog@480.png

Esto también se podría alterar para que funcione con imágenes no cuadradas, nombradas imageName@width-height

 func getPNGImageForSize(width: Float, height: Float, named: String) -> UIImage?{ let scaledWidth: Int = Int(ceil(width * Float(UIScreen.mainScreen().scale)) let scaledHeight: Int = Int(ceil(height * Float(UIScreen.mainScreen().scale)) let imageName: String = "\(named)@\(width)-\(height)" let path = NSBundle.mainBundle().pathForResource(imageName, ofType: "png") return UIImage(contentsOfFile: (path ?? "")) } 

Debes configurar tu image para que se vea como en iPhone6 ​​+, lo que consumirá las imágenes de @ 3x, luego se networkingucirá a su tamaño de image de 2x que será consumido por los dispositivos iPhone4S a iPhone6 ​​y luego boostá la escala de tu image a @ 1x que usan las versiones anteriores de los dispositivos iPad.

Cree 3 imágenes diferentes con 3 escalas de @1x @2x y @3x .

hay 3 solamente, el iPhone anterior – 3S, 4, el iPad no retina todos consume imágenes @ 1x, mientras que iPad Air, iPad retina, iPhone 4S – iPhone 6 usa @ 2x y iPhone 6+ usa @ 3x FYI. He respondido esta pregunta antes aquí está el enlace

Aquí hay otro buen blog sobre escalado de imágenes en dispositivos IOS (todos)

EDITAR

y sobre aclarar dudas sobre cómo los iPhone5 y 6 usan imágenes @ 2x. Bueno iPhone5 usa la misma image que para iPhone6, es decir, imágenes de 2x a pesar de la altura a medida que iPhone5 se networkinguce a 2x en su propio límite, por lo tanto, no hay nada de qué preocuparse por esto. Xcode se encarga de esto bastante eficientemente.