swift - Cargar imagen desde el framework iOS 8
ios8 (5)
En Swift 3.0:
let currentBundle = Bundle(for: YOURCLASS.self)
guard let path = currentBundle.path(forResource: imageName, ofType: "jpg") else { return defaultImage }
return UIImage(contentsOfFile: path) ?? defaultImage
Estoy tratando de cargar una imagen de un framework iOS 8 que estoy escribiendo (en Swift). Estoy usando Xcode 6 Beta 6
Este código no funciona (es decir, carga la imagen) si la imagen se almacena en los conjuntos de imágenes.xcassets de mi marco:
let image = UIImage(named: "Background.png")
Si la imagen se almacena en un Images.xcassets
de una aplicación host (que usa el marco), entonces la imagen se carga correctamente (desde el código dentro del marco).
Puedo ver que las Images.xcassets
del marco están incluidas en la fase de Copy Bundle Resources
.
También estoy usando un archivo de guión gráfico como un recurso en el marco; y esto se carga correctamente.
He intentado cambiar el nombre de Images.xcassets del marco para evitar algún tipo de colisión de nombres con la aplicación host, pero esto tampoco funciona.
La respuesta aceptada no funcionó para mí. Aquí hay una manera infalible de cargar una imagen incrustada en un marco dinámico:
var bundle = NSBundle(forClass: self.classForCoder)
if let bundlePath = NSBundle(forClass: self.classForCoder).resourcePath?.stringByAppendingString("/MYLIB.bundle"), resourceBundle = NSBundle(path: bundlePath) {
bundle = resourceBundle
}
let image = UIImage(named: "my-embedded-image", inBundle: bundle, compatibleWithTraitCollection: nil)
Otra opción es asignar el identificador de paquete, lo que tiene más sentido que asignar clase cuando se trata de legibilidad.
En Swift 3 :
UIImage(named: "MyImage", in: Bundle(identifier: "bundleIdentifier"), compatibleWith: nil)
Si bien la respuesta de @Renatus es perfectamente válida y aborda el problema central (se debe especificar el paquete para el marco), quería publicar la solución con la que fui, ya que es un poco más directa:
Swift 3.0 / 4.0
let image = UIImage(named: "YourImage", in: Bundle(for: YOURFRAMEWORKCLASS.self), compatibleWith: nil)
Alternativamente, puede usar este patrón para funciones que no sean de class
, también conocidas como "no estáticas":
let image = UIImage(named: "YourImage", in: Bundle(for: type(of: self)), compatibleWith: nil)
o este patrón para funciones de class
:
let image = UIImage(named: "YourImage", in: Bundle(for: self), compatibleWith: nil)
Estas alternativas son mejores para cortar y pegar.
UIImage (llamado: "Background.png") llama a NSBundle.mainBundle () en las partes internas. Por lo tanto, su código está tratando de encontrar recursos en el paquete de su aplicación host, no en el paquete de marcos. Para cargar UIImage desde el paquete de su marco, use este fragmento de código:
let frameworkBundle = NSBundle(forClass: YOURFRAMEWORKCLASS.self)
let imagePath = frameworkBundle.pathForResource("yourImage.png", ofType: "")
if imagePath != nil {
result = UIImage(contentsOfFile: imagePath!)
}
Editado: explicación añadida (gracias a milz)