Загрузить изображение из системы iOS 8
Я пытаюсь загрузить изображение из фреймворка iOS 8, который я пишу (в Swift). Я использую Xcode 6 Beta 6
Этот код не работает (т.е. загружает изображение), если изображение хранится в моей структуре Images.xcassets
:
let image = UIImage(named: "Background.png")
Если изображение хранится в Images.xcassets
хост-приложения (которое использует фреймворк), изображение правильно загружается (из кода внутри рамки).
Я вижу, что фреймворк Images.xcassets
включен в фазу Copy Bundle Resources
.
Я также использую файл раскадровки в качестве ресурса в рамках; и это правильно загружается.
Я попытался переименовать Images.xcassets структуры, чтобы избежать столкновения имен с хост-приложением, но это тоже не работает.
Ответы
Ответ 1
Хотя ответ @Renatus является абсолютно верным и решает основную проблему (необходимо указать пакет для фреймворка), я хотел опубликовать решение, с которым работал, поскольку оно немного более прямое:
Swift 3.0/4.0/5.0
let image = UIImage(named: "YourImage", in: Bundle(for: YOURFRAMEWORKCLASS.self), compatibleWith: nil)
В качестве альтернативы вы можете использовать этот шаблон для class
non-, также называемого non- "static", функций:
let image = UIImage(named: "YourImage", in: Bundle(for: type(of: self)), compatibleWith: nil)
или этот шаблон для функций class
:
let image = UIImage(named: "YourImage", in: Bundle(for: self), compatibleWith: nil)
Эти альтернативы лучше для резки и вставки.
Ответ 2
UIImage (named: "Background.png" ) вызывает NSBundle.mainBundle() во внутренних деталях. Таким образом, ваш код пытается найти ресурс в вашем пакете приложений для хоста, а не в пакете frameworks. Чтобы загрузить UIImage из пакета framework, используйте этот фрагмент:
let frameworkBundle = NSBundle(forClass: YOURFRAMEWORKCLASS.self)
let imagePath = frameworkBundle.pathForResource("yourImage.png", ofType: "")
if imagePath != nil {
result = UIImage(contentsOfFile: imagePath!)
}
Отредактировано: добавлено объяснение (спасибо to milz)
Ответ 3
В 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
Ответ 4
Другой вариант - назначить идентификатор пакета, который имеет больше смысла, чем присвоение класса, когда дело доходит до читаемости.
В Swift 3:
UIImage(named: "MyImage", in: Bundle(identifier: "bundleIdentifier"), compatibleWith: nil)
Ответ 5
Принятый ответ не помог мне. Здесь можно найти путь для загрузки изображения, встроенного в динамическую структуру:
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)