Acesse o Catálogo de Ativos de maneira programática

96

Sei que é um novo recurso e talvez não seja possível, mas adoraria usar um Catálogo de ativos para organizar meus ativos, mas acesso todas as minhas imagens de maneira programática. Como faço para acessar minhas imagens, agora? Ainda os acesso por seus nomes de arquivo, como:

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

Aparentemente, o Catálogo de ativos não faz referência à extensão, então seria mais eficiente acessá-lo sem o ".png"?

O motivo pelo qual estou perguntando, em vez de testar por mim mesmo, é que mesmo depois de remover meus ativos e o Catálogo de ativos e, em seguida, limpar a pasta de construção, ainda posso acessar meus ativos em meu aplicativo. Isso está me impedindo de testar o Catálogo de ativos, quando o implemento.

Depois de examinar o Catálogo de ativos, encontrei o "Contents.json" para cada ativo e está formatado da seguinte forma:

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

Ainda não tenho certeza de como devo acessá-lo, mas talvez isso ajude?

RileyE
fonte

Respostas:

138

Para acessar a imagem do Catálogo de ativos, você só precisa acessar o nome do grupo de ativos sem quaisquer extensões.

Portanto, se você adicionar uma imagem nomeada @"[email protected]"ao Catálogo de ativos, ele criará um grupo de ativos chamado my-button.

Agora, tudo que você precisa fazer é acessar a imagem assim:

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

Além disso, você pode editar o grupo de ativos renomeando-o (sem renomear as imagens) ou alterando seus componentes individuais. Isso permitirá que você siga convenções de nomenclatura mais fáceis, bem como mostre ativos completamente diferentes entre diferentes UIScreen scales sem qualquer scaleverificação.

Para incorporar imagens para diferentes tamanhos de dispositivos, pode ser necessário alternar no subtítulo "Dispositivos" nas opções do Grupo de catálogo de ativos. Aqui está um exemplo dessa alternância (disponível clicando com o botão direito do mouse no grupo).

RileyE
fonte
Versões R4, ou seja, suporte para 568, estão lá. Se você visualizar os atributos de um conjunto de imagens, você pode selecionar 'Específico do dispositivo' na lista suspensa Dispositivos, e então você pode adicionar uma imagem R4, que aparecerá em dispositivos 4 "rodando iOS 7.
bandejapaisa
Existe alguma maneira de acessar programaticamente as informações de fatiamento? Além de obter a propriedade capInsets do objeto UIImage?
Klaas
@Klaas Não sei por que você precisa obtê-lo por outro meio que não o UIImage. E pelo que vi, não, já que cada Imagem de Categoria no Grupo pode ser uma imagem completamente diferente, então não haverá nenhuma informação geral, como fatiamento, disponível. Ou eu estou esquecendo de alguma coisa?
RileyE
@RileyE Eu preciso fazer alguns cálculos para uma exibição de sobreposição personalizada e gostaria de usar os mesmos insets. Quando eu apenas tenho que criar um UIImage para meus cálculos, prefiro armazenar o valor necessário em outro lugar (e redundante).
Klaas
1
O código Swift parece ter sido alterado paraUIImage(named: imageName)
HKTonyLee
26

Além disso, a Apple adicionou uma nova maneira de obter imagens de ativos com o Swift 3, que está chamando de 'Image Literal' e funciona como abaixo:

Literal de imagem

Yigit Yilmaz
fonte
5

Rápido

Você pode obter uma referência a uma imagem em seu catálogo de ativos com

UIImage(named: "myImageName")

Você não precisa incluir a extensão.

Suragch
fonte
1

@RileyE está 100% certo. No entanto, com base em minhas experiências, também é importante notar que às vezes a referência do catálogo de ativos para a imagem pode conter espaços em branco à direita. Você provavelmente não notaria se usar storyboards / xibs como o preenchimento automático irá adicioná-lo. Mas quando você o faz referência a partir do código, não é tão óbvio qual é o problema.

AppHandwerker
fonte