2014-02-14 12 views
15

Ich bin in einer Situation, in der ich Anhänge von einer Nachricht auflisten. Jedem Anhang ist ein NSURL zugeordnet, der einen Pfad zu den Anhangsdaten darstellt. Im Fall von Nicht-Bild-Anhängen möchte ich vorgenerierte Miniaturbilder anstelle einer Vorschau laden (d. H. Excel-Dokumente, PDF, Word usw.).Kann ich einen NSURL aus einem XCAssets-Bundle erhalten?

Ich habe derzeit diese Bilder in meinem Projekt, in einem XCAssets Bundle. Ich kann sie unter Verwendung [UIImage imageNamed:@"someName"] bekommen. Ich kann nicht über NSBundles verschiedene Ressourcen-Lookup-Methoden darauf zugreifen. Ändert das XCAssets-Bundle irgendwie die Dateinamen der gesuchten Icon-Images?

Hier ist der Code, mit dem ich gerade arbeite. Pfad ist jedes Mal Null. Muss ich in diesem Fall keine XCAsets verwenden?

Antwort

8

Wenn Sie auf iOS 7+ abzielen, werden die Assets in Xcode 5 in ein neues Dateiformat umgewandelt. 1 Datei für alle Assets. Dies bedeutet, dass Sie nicht direkt auf die Datei zugreifen können.

Wenn Sie direkt auf die Datei zugreifen müssen, können Sie sie als normales Bild außerhalb eines Asset-Katalogs einfügen.

+1

Das ist, was der ich Angst hatte. Ich konnte keine direkte Dokumentation finden, um dies zu bestätigen, also die Frage. Ich muss vielleicht nur diese Änderung vornehmen. Vielen Dank. – slycrel

+2

Ich habe mich nie mit den Details beschäftigt, aber '[UIImage imageNamed: ...]' funktioniert immer noch mit Bildern in einem Asset-Bundle. – Holly

+0

Und Sie können tatsächlich Datei von dort in jedes Verzeichnis speichern, das Sie mögen. :) – Legoless

5

Ich wollte auf einige Vektor-Assets zugreifen, um UNNotificationAttachment mit lokalen Ressourcen zu erstellen, also kam ich auf diese Hilfsklasse. Es erhält im Grunde nur Bild von Assets, speichert seine Daten auf der Festplatte und gibt die URL der Datei zurück. Ich hoffe das hilft jemandem.

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

Swift 3 und Swift 2.3 Versionen von the answer by @tadija:

Swift 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

Swift 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 
} 
Verwandte Themen