AcessarRegisto de Catálogo de Ativo de Acesso

Parece que:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png"];

Não retorna nada para ativos que estão dentro do catálogo de resources Images.xcassets. Eu também tentei:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images"];

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images.xcassets"];

Mas nenhum deles funcionou também.

Alguém já teve sucesso recuperando caminhos para ativos no catálogo?

O mesmo problema, mas não acho que poderíamos acessá-lo via pathForResource: exceto abaixo:

 UIImage* image = [UIImage imageNamed:@"name-in-asset-catalog"]; 

Foi claramente documentado :

Cada conjunto em um catálogo de ativos tem um nome. Você pode usar esse nome para carregar programaticamente qualquer imagem individual contida no conjunto. Para carregar uma imagem, chame o método UIImage: imageNamed:, passando o nome do conjunto que contém a imagem.

Descobri que no pacote do aplicativo compatível , um arquivo chamado “Assets.car” foi lançado, e acho que são os conjuntos de imagens inteiros no meu projeto e que deveriam ter sido compactados ou algo assim.

Consulte a documentação da Apple:

O Xcode 5 fornece funcionalidade diferente para catálogos de ativos, dependendo do destino de implementação do seu projeto:

  • Para todos os projetos, imagens individuais podem ser carregadas usando nomes de conjuntos.
  • Para projetos com um destino de implementação do iOS 7, o Xcode compila seus catálogos de ativos em um formato de arquivo binário de tempo de execução que reduz o tempo de download do seu aplicativo.

Então é isso.

Eu também estou procurando uma maneira que não use imageNamed: eu não quero tempo de execução para armazenar minhas imagens em cache.

 [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], imgName]]; 

imgName: o nome do conjunto de imagens, não importando o nome verdadeiro da imagem no conjunto de imagens.

Eu queria acessar alguns resources de vetor para criar o UNNotificationAttachment com resources locais, então UNNotificationAttachment essa class auxiliar. Basicamente, apenas obtém imagem dos ativos, salva seus dados no disco e retorna o URL do arquivo. Espero que ajude alguém.

 import UIKit class AssetExtractor { static func createLocalUrl(forImageNamed name: String) -> URL? { let fileManager = FileManager.default let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0] let url = cacheDirectory.appendingPathComponent("\(name).png") guard fileManager.fileExists(atPath: url.path) else { guard let image = UIImage(named: name), let data = UIImagePNGRepresentation(image) else { return nil } fileManager.createFile(atPath: url.path, contents: data, attributes: nil) return url } return url } } 

Tente usar o nome da imagem conforme determinado na etapa “Compilar o catálogo de ativos”. Você encontrará isso na saída de compilation. Certifique-se de expandir a transcrição – você deve ver algo assim:

 /* com.apple.actool.compilation-results */ /path/to/Debug-iphonesimulator/Your.app/LaunchImage-800-Portrait-736h@3x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-800-667h@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-568h@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape~ipad.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape@2x~ipad.png 

Testado usando +[UIImage imageNamed:] com o Xcode 6.1.1.

Embora exista um arquivo Contents.json (veja abaixo) associado a cada item em xcassets que contém os nomes de arquivos das imagens desse item, ele não parece estar acessível no nível do sistema de arquivos. Todas as imagens são colocadas em uma única pasta do sistema de arquivos na compilation. O arquivo json é gerado automaticamente e não deve ser editado, mas fornece um modelo para uma solução alternativa.

Nomeie cada arquivo com um sufixo consistente para corresponder à expressão, escala e subtipo correspondentes que aparecem no arquivo json. Isso requer trabalho manual, selecionando a opção ‘Mostrar no Finder’ para cada ativo e renomeando cada arquivo, mas depois de concluído, você pode usar pathForResource em combinação com uma function para adicionar o sufixo apropriado ao nome do ativo base para recuperar apropriadamente imagem de tamanho.

Exemplo de código para recuperar o caminho:

 NSString *imageName = @"Add to Cart"; NSString *imageSuffix = [self someMethodThatDeterminesSuffix]; // Example: "-iphone-2x-retina4" NSString *imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@%@", imageName, imageSuffix] ofType:@"png"]; 

Exemplo do arquivo Contents.json para o recurso de imagem “Adicionar ao carrinho”:

 { "images" : [ { "idiom" : "iphone", "scale" : "1x", "filename" : "Add to Cart-iphone-1x.png" }, { "idiom" : "iphone", "scale" : "2x", "filename" : "Add to Cart-iphone-2x.png" }, { "idiom" : "iphone", "filename" : "Add to Cart-iphone-2x-retina4.png", "subtype" : "retina4", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } 

Para lançar imagens e icons de aplicativos em particular, os caminhos da imagem estão disponíveis através das teclas UILaunchImages e CFBundleIcons Info.plist, respectivamente. Parece que essas imagens são geradas individualmente e os valores do Info.plist atualizados durante o desenvolvimento do aplicativo ao usar catálogos de ativos (e, se não, essas chaves são gravadas diretamente na interface do usuário do Xcode). Talvez seja necessário escrever algum código para descobrir o subdiretório correto a ser usado, mas as imagens estão disponíveis separadamente e você pode evitar o uso de imageNamed nesse caso.