programing tip

자산 카탈로그 pathForResource에 액세스

itbloger 2020. 11. 22. 19:08
반응형

자산 카탈로그 pathForResource에 액세스


다음과 같이 나타납니다.

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

Images.xcassets 자산 카탈로그 내에있는 자산에 대해서는 아무것도 반환하지 않습니다. 나는 또한 시도했다 :

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

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

그러나 둘 다 효과가 없었습니다.

카탈로그에있는 자산에 대한 경로를 검색하는 데 성공한 사람이 있습니까?


같은 문제이지만 pathForResource:아래를 제외하고 를 통해 액세스 할 수 없다고 생각 합니다.

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

명확하게 문서화 되었습니다 .

자산 카탈로그의 각 세트에는 이름이 있습니다. 이 이름을 사용하여 세트에 포함 된 개별 이미지를 프로그래밍 방식으로로드 할 수 있습니다. 이미지를로드하려면 UIImage : imageNamed : 메서드를 호출하여 이미지가 포함 된 집합의 이름을 전달합니다.

컴파일 된 앱 패키지에서 "Assets.car" 라는 이름의 파일이 나왔음을 발견했습니다.이 파일이 프로젝트의 전체 이미지 세트이고 압축되어 있어야한다고 생각합니다.

Apple의 문서를 참조하십시오.

Xcode 5는 프로젝트의 배포 대상에 따라 자산 카탈로그에 대해 다른 기능을 제공합니다.

  • 모든 프로젝트에서 개별 이미지는 세트 이름을 사용하여로드 할 수 있습니다.
  • 배포 대상이 iOS 7 인 프로젝트의 경우 Xcode는 자산 카탈로그를 앱의 다운로드 시간을 줄이는 런타임 바이너리 파일 형식으로 컴파일합니다.

그게 다입니다.

나는 또한 사용하지 않는 방법을 찾고 있는데 imageNamed:, 런타임이 내 이미지를 캐시하고 싶지 않습니다.


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

imgName : 이미지 세트의 이름이며 이미지 세트에있는 이미지의 실제 이름을 신경 쓰지 않습니다.


UNNotificationAttachment로컬 리소스 로 만들기위한 벡터 자산에 액세스하고 싶었 기 때문에이 도우미 클래스 를 만들었 습니다. 기본적으로 자산에서 이미지를 가져오고 데이터를 디스크에 저장하고 파일 URL을 반환합니다. 누군가에게 도움이되기를 바랍니다.

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
    }

}

"자산 카탈로그 컴파일"단계에서 결정된 이미지 이름을 사용해보십시오. 빌드 출력에서 ​​찾을 수 있습니다. 스크립트를 확장해야합니다. 다음과 같은 내용이 표시되어야합니다.

/* 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

+[UIImage imageNamed:]Xcode 6.1.1을 사용하여 테스트했습니다 .


Although there is a Contents.json file (see below) associated with each item in xcassets that contains the filenames of that item's images, it does not appear to be accessible at the filesystem level. All images are placed in a single filesystem folder upon compilation. The json file is auto-generated and should not be edited, but it does provide a template for a workaround.

Name each file with a consistent suffix to match the corresponding idiom, scale and subtype appearing in the json file. This requires manual work by selecting the 'Show in Finder' option for each asset and renaming each file, but once completed, you can then use pathForResource in combination with a function to add the appropriate suffix to the base asset name to retrieve the appropriately-sized image.

Sample code to retrieve path:

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

Example Contents.json file for the "Add to Cart" image asset:

{
  "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"
  }
}

For launch images and application icons in particular, the image paths are available via the UILaunchImages and CFBundleIcons Info.plist keys respectively. It appears those images are generated individually and the Info.plist values updated during the app build when using asset catalogs (and if not, those keys are written to directly by the Xcode UI). You might have to write some code to figure out the correct sub-dictionary to use, but the images are available separately and you can avoid using imageNamed in that case.

참고URL : https://stackoverflow.com/questions/18968352/access-asset-catalog-pathforresource

반응형