Подтвердить что ты не робот

Загрузить изображение из системы 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 структуры, чтобы избежать столкновения имен с хост-приложением, но это тоже не работает.

4b9b3361

Ответ 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)