Acceder al catálogo de activos mediante programación

96

Sé que es una función nueva y puede que no sea posible, pero me encantaría poder utilizar un catálogo de activos para organizar mis activos, pero accedo a todas mis imágenes mediante programación. ¿Cómo accederé a mis imágenes ahora? ¿Todavía accedo a ellos por sus nombres de archivo así:

[UIImage imageNamed:@"my-asset-name.png"];

Aparentemente, el Catálogo de activos no hace referencia a la extensión, entonces, ¿sería más eficiente acceder a ella sin el ".png"?

La razón por la que pregunto en lugar de probar por mí mismo es que incluso después de eliminar mis activos y el Catálogo de activos y luego limpiar la carpeta de compilación, todavía puedo acceder a mis activos en mi aplicación. Esto me impide probar el catálogo de activos cuando lo implemento.

Después de buscar en el Catálogo de activos, encontré el "Contenido.json" para cada activo y tiene el formato siguiente:

{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x",
      "filename" : "[email protected]"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

Todavía no estoy seguro de cómo debería acceder a él, pero tal vez esto ayude.

RileyE
fuente

Respuestas:

138

Para acceder a la imagen desde el Catálogo de activos, solo necesita acceder al nombre del grupo de activos sin extensiones.

Entonces, si agrega una imagen nombrada @"[email protected]"al Catálogo de activos, se creará un grupo de activos llamado my-button.

Ahora, todo lo que tienes que hacer es acceder a la imagen así:

// Objective-C
[UIImage imageNamed:@"my-button"];
// Swift
UIImage(named: "my-button")

Además, puede editar el grupo de activos cambiando el nombre (sin cambiar el nombre de las imágenes) o cambiando sus componentes individuales. Esto le permitirá seguir convenciones de nomenclatura más sencillas, así como mostrar activos completamente diferentes entre diferentes UIScreen scalecorreos electrónicos sin ninguna scaleverificación.

Para incorporar imágenes para diferentes tamaños de dispositivos, es posible que deba alternarlo bajo el subtítulo "Dispositivos" en las opciones del Grupo de catálogo de activos. Aquí hay un ejemplo de esa opción (disponible haciendo clic derecho en el grupo).

RileyE
fuente
Hay versiones R4, es decir, soporte 568. Si ve los atributos de un conjunto de imágenes, puede seleccionar 'Dispositivo específico' en el menú desplegable Dispositivos, y luego puede agregar una imagen R4, que aparecerá en dispositivos de 4 "que ejecutan iOS 7.
bandejapaisa
¿Hay alguna forma de acceder mediante programación a la información de corte? ¿Además de obtener la propiedad capInsets del objeto UIImage?
Klaas
@Klaas No estoy seguro de por qué necesitarías obtenerlo por otros medios que no sean UIImage. Y por lo que he visto, no, ya que cada imagen de categoría en el grupo podría ser una imagen completamente diferente, por lo que no habrá ninguna información general disponible, como el corte. ¿O me estoy perdiendo algo?
RileyE
@RileyE Necesito hacer algunos cálculos para una vista de superposición personalizada y me gustaría usar las mismas inserciones. Cuando solo tengo que crear un UIImage para mis cálculos, preferiría almacenar el valor necesario en otro lugar (y redundante).
Klaas
1
El código Swift parece haber cambiado aUIImage(named: imageName)
HKTonyLee
26

Además, Apple ha agregado una nueva forma de obtener imágenes de los activos con Swift 3, se llama como 'Image Literal' y funciona de la siguiente manera:

Imagen literal

Yigit Yilmaz
fuente
5

Rápido

Puede obtener una referencia a una imagen en su catálogo de activos con

UIImage(named: "myImageName")

No es necesario incluir la extensión.

Suragch
fuente
1

@RileyE tiene toda la razón. Sin embargo, según mis experiencias, también vale la pena señalar que a veces la referencia del catálogo de activos para la imagen puede contener espacios en blanco al final. Probablemente no notaría si usar guiones gráficos / xibs como autocompletar lo agregará. Pero cuando se hace referencia a él desde el código, no es tan obvio cuál es el problema.

AppHandwerker
fuente