2013-09-23 30 views
61

Dường như:Tiếp cận Danh mục nội dung pathForResource

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

Không trả về bất cứ điều gì đối với tài sản mà bên trong Danh mục tài sản Images.xcassets. Tôi cũng đã cố gắng:

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

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

Nhưng không ai trong số những người làm việc trong hai.

Có ai đã thành công khi truy xuất đường dẫn đến nội dung trong danh mục không?

+5

Có cùng vấn đề! – vilanovi

+0

Tôi cũng cần các đường dẫn thực tế cho các hình ảnh vì tôi không muốn sử dụng imageNamed (bộ nhớ đệm bị hỏng) và hóa ra rằng Catalogue danh mục cũng bị hỏng mà không có quyền truy cập có lập trình. – Alper

+0

@MobileVet bạn đã bao giờ tìm thấy một giải pháp cho điều này? – Keab42

Trả lời

24

Cùng một vấn đề, nhưng tôi không nghĩ rằng chúng ta có thể truy cập nó qua pathForResource:, ngoại trừ dưới đây:

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

Nó đã được rõ ràng documented:

Mỗi bộ tại một cửa hàng tài sản có Tên. Bạn có thể sử dụng tên đó để tải theo chương trình bất kỳ hình ảnh riêng lẻ nào có trong bộ này. Để tải hình ảnh, hãy gọi phương thức UIImage: imageNamed:, chuyển tên của tập hợp chứa hình ảnh.

tôi thấy rằng trong gói ứng dụng tuân thủ, một file có tên "Assets.car" ra, và tôi nghĩ rằng đó là bộ toàn bộ hình ảnh trong dự án của tôi, và cần phải có được nén hoặc một cái gì đó.

Tham khảo tài liệu của Apple:

Xcode 5 cung cấp chức năng khác nhau cho catalog tài sản tùy trên mục tiêu triển khai cho dự án của bạn:

  • Đối với tất cả các dự án, hình ảnh cá nhân có thể được nạp bằng bộ tên.
  • Đối với các dự án có mục tiêu triển khai iOS 7, Xcode biên soạn nội dung của bạn danh mục thành định dạng tệp nhị phân thời gian chạy giúp giảm thời gian tải xuống cho ứng dụng của bạn.

Vậy là xong.

Tôi cũng đang tìm cách không sử dụng imageNamed:, tôi không muốn chạy bộ nhớ cache để lưu hình ảnh của mình.

+4

Tôi có cùng một vấn đề về lưu trữ hình ảnh tại đây http://stackoverflow.com/questions/19919113/uiimage-caching-with-xcode-asset-catalogs#comment29693553_19919113. Nó xuất hiện như imageNamed: bộ nhớ đệm không hoạt động như mong đợi khi sử dụng danh mục tài sản, bởi vì bộ nhớ không bao giờ được giải phóng bởi hệ thống, thậm chí không phải trên cảnh báo bộ nhớ. – knl

+6

Tôi có thể xác minh điều này. Bộ nhớ không được giải phóng. Phần này của iOS khá bị hỏng. – Alper

+0

Điều gì sẽ xảy ra nếu có thư mục trong nội dung và tôi chỉ cần ảnh trong thư mục này? bất kỳ giúp đỡ xin vui lòng? –

1

Mặc dù có tệp Contents.json (xem bên dưới) được liên kết với từng mục trong xcassets chứa tên tệp của hình ảnh của mục đó, có vẻ như không thể truy cập được ở cấp hệ thống tệp. Tất cả các hình ảnh được đặt trong một thư mục hệ thống tập tin duy nhất khi biên dịch. Tệp json được tạo tự động và không được chỉnh sửa, nhưng nó cung cấp một mẫu cho một giải pháp thay thế.

Đặt tên cho từng tệp có hậu tố nhất quán để khớp với thành ngữ, quy mô và loại phụ tương ứng xuất hiện trong tệp json.Điều này yêu cầu công việc thủ công bằng cách chọn tùy chọn 'Hiển thị trong Trình tìm kiếm' cho từng nội dung và đổi tên mỗi tệp, nhưng sau khi hoàn thành, bạn có thể sử dụng pathForResource kết hợp với hàm để thêm hậu tố thích hợp vào tên nội dung cơ sở để truy xuất một cách phù hợp- hình ảnh có kích thước.

Mẫu mã để lấy đường dẫn:

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

Ví dụ Contents.json tập tin cho nội dung hình ảnh "Thêm vào giỏ hàng":

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

Khai thác tuyệt vời, bạn đã thử chưa? Nó có hoạt động không? – MobileVet

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

imgName: tên của hình ảnh bộ, không quan tâm đến tên thật của hình ảnh trong Image set.

+1

Không hoạt động với hình ảnh trong bất kỳ gói nào khác ngoài gói chính. – user1010819

+1

Tất nhiên, tôi sử dụng [NSBundle mainBundle] tại đây. – Lyle

+0

Cảm ơn, bạn đời. Cách bạn đã làm nó là một sự thay thế tốt cho + (UIImage *) imageNamed: (NSString *) tên inBundle: (NSBundle *) bundle compatibleWithTraitCollection: (UITraitCollection *) traitCollection. Nó đã được giới thiệu với iOS 8.0 và tôi cần phải bao gồm 7.x.x là tốt. –

2

Thử sử dụng tên hình ảnh như được xác định trong bước "Biên dịch danh mục tài sản". Bạn sẽ tìm thấy điều này trong đầu ra xây dựng. Hãy chắc chắn để mở rộng bảng điểm - bạn sẽ thấy một cái gì đó như thế này:

/* com.apple.actool.compilation-results */ 
/path/to/Debug-iphonesimulator/Your.app/[email protected] 
/path/to/Debug-iphonesimulator/Your.app/[email protected] 
/path/to/Debug-iphonesimulator/Your.app/[email protected] 
/path/to/Debug-iphonesimulator/Your.app/[email protected] 
/path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape~ipad.png 
/path/to/Debug-iphonesimulator/Your.app/[email protected]~ipad.png 

Tested sử dụng +[UIImage imageNamed:] với Xcode 6.1.1.

0

Đặc biệt, đối với các hình ảnh khởi động và biểu tượng ứng dụng, các đường dẫn hình ảnh có sẵn thông qua các phím UILaunchImages và CFBundleIcons Info.plist tương ứng. Có vẻ như những hình ảnh đó được tạo riêng lẻ và các giá trị Info.plist được cập nhật trong quá trình xây dựng ứng dụng khi sử dụng danh mục tài sản (và nếu không, các khóa đó được viết trực tiếp bởi giao diện người dùng Xcode). Bạn có thể phải viết một số mã để tìm ra từ điển chính xác để sử dụng, nhưng các hình ảnh có sẵn một cách riêng biệt và bạn có thể tránh sử dụng imageNamed trong trường hợp đó.

10

Tôi muốn truy cập một số tài sản vectơ để tạo UNNotificationAttachment với tài nguyên cục bộ, vì vậy tôi đã tìm ra lớp trợ giúp này. Về cơ bản nó chỉ nhận được hình ảnh từ các tài sản, lưu dữ liệu của nó vào đĩa và trả về URL của tệp. Tôi hy vọng rằng sẽ giúp một ai đó.

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 
    } 

} 
+1

Tôi đã có cùng một vấn đề và điều này làm việc tuyệt vời. Cám ơn vì đã chia sẻ. – RommelTJ

+0

Rất tuyệt! Tôi đã biến nó thành một hàm tĩnh trên lớp UIImage. –

Các vấn đề liên quan