2014-02-14 28 views
15

我處於從消息列出附件的情況。每個附件都有一個與它關聯的NSURL,它表示附件數據的路徑。在非圖像附件的情況下,我想在預覽位置(即excel文檔,PDF,單詞等)加載預先生成的圖標縮略圖。我可以從XCAssets包中獲取NSURL嗎?

我目前在XCAssets包中的項目中包含這些圖像。我可以使用[UIImage imageNamed:@"someName"]來得到他們。我似乎無法通過NSBundle的各種資源查找方法獲取它們。 XCAssets軟件包是否以某種方式更改我正在查找的圖標圖像的文件名?

這是我目前正在使用的代碼。路徑每次都是零。在這種情況下,我是否需要不使用XCAssets?

+ (NSURL *)mediaURLWithMessage:(SRMediaMessage*)message 
{ 
    NSURL *url = message.mediaURL; 

    // if this is an image URL or non-existant, there is no work left to do, return it. 
    if (!url || (message.secureFile.secureFileMimeType & SRSecureFileMimeTypeImage)) 
    return url; 

    NSString *filename = @"unknown"; 

    switch (message.secureFile.secureFileMimeType) 
    { 
    case SRSecureFileMimeTypeDOC: 
     filename = @"doc"; 
     break; 

    case SRSecureFileMimeTypePPT: 
     filename = @"ppt"; 
     break; 

    case SRSecureFileMimeTypePDF: 
     filename = @"pdf"; 
     break; 

    case SRSecureFileMimeTypeXLS: 
     filename = @"exl"; 
     break; 

    case SRSecureFileMimeTypeCSV: 
     filename = @"csv"; 
     break; 

    case SRSecureFileMimeTypeTXT: 
     filename = @"txt"; 
     break; 

    case SRSecureFileMimeTypeRTX: 
     filename = @"rtf"; 
     break; 

    default: 
    case SRSecureFileMimeTypeMP4: 
     // unknown icon for now. 
     break; 

     // unused but available: 
//  @"ilife" 

    } 

    NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:nil]; 
    if (path) 
    url = [NSURL fileURLWithPath:path]; 

    return url; 
} 

回答

8

如果您的目標是iOS 7+,Xcode 5現在會將這些資產轉換爲新的文件格式。 1文件的所有資產。這意味着你無法直接訪問文件。

如果您需要直接訪問該文件,則可以將其作爲資產目錄之外的普通圖像加入。

+1

這正是我所擔心的。我一直無法找到任何直接的文件來證實這一點,因此這個問題。我可能只需要做這個改變。謝謝。 – slycrel

+2

我從未查看過這些細節,但[UIImage imageNamed:...]仍然適用於資產包中的圖像。 – Holly

+0

而且您實際上可以將文件保存到您喜歡的任何目錄。 :) – Legoless

5

我想訪問一些矢量資產,用本地資源創建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 
    } 

} 
1

夫特3個SWIFT 2.3版本the answer by @tadija

夫特3

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") 
     let path = url.path 

     guard fileManager.fileExists(atPath: path) else { 
      guard 
       let image = UIImage(named: name), 
       let data = UIImagePNGRepresentation(image) 
       else { return nil } 

      fileManager.createFile(atPath: path, contents: data, attributes: nil) 
      return url 
     } 

     return url 
    } 

} 

SWIFT 2.3

import UIKit 

class AssetExtractor { 

    static func createLocalUrl(forImageNamed name: String) -> NSURL? { 

     let fileManager = NSFileManager.defaultManager() 
     let cacheDirectory = fileManager.URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask)[0] 
     guard 
      let url = cacheDirectory.URLByAppendingPathComponent("\(name).png"), 
      let path = url.path 
      else { return nil } 

     guard fileManager.fileExistsAtPath(path) else { 
      guard 
       let image = UIImage(named: name), 
       let data = UIImagePNGRepresentation(image) 
       else { return nil } 

      fileManager.createFileAtPath(path, contents: data, attributes: nil) 
      return url 
     } 

     return url 
    } 

} 
0

斯威夫特3.X

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") 
    let path = url.path 

    guard fileManager.fileExists(atPath: path) else { 
     guard 
      let image = UIImage(named: name), 
      let data = UIImagePNGRepresentation(image) 
      else { return nil } 

     fileManager.createFile(atPath: path, contents: data, attributes: nil) 
     return url 
    } 

    return url 
} 
相關問題