IT-Swarm.Net

İOS 8 çerçevesinden görüntü yükle

Yazdığım bir iOS 8 çerçevesinden bir görüntü yüklemeye çalışıyorum (Swift'de). Xcode 6 Beta 6 kullanıyorum

Görüntü benim çerçevemin Images.xcassets dosyasında saklanırsa, bu kod çalışmaz (yani görüntü yükle):

let image = UIImage(named: "Background.png")

Görüntü bir Host uygulamasının Images.xcassets içinde saklanırsa (çerçeveyi kullanan), görüntü düzgün şekilde yüklenir (çerçevenin içindeki koddan).

Çerçevenin Images.xcassets öğesinin Copy Bundle Resources aşamasına dahil olduğunu görebiliyorum.

Ayrıca storyboard dosyasını çerçeve içinde kaynak olarak kullanıyorum; ve bu düzgün yükler.

Ana Bilgisayar uygulamasıyla bir tür adlandırma çakışmasını önlemek için çerçevenin Images.xcasset'lerini yeniden adlandırmayı denedim, ancak bu da çalışmıyor.

30
Daniel

@Renatus'un cevabı tam olarak geçerli olsa ve ana konuyu ele alırken (çerçevenin belirtilmesi gerekiyor), biraz daha doğrudan olduğu için birlikte gittiğim çözümü göndermek istedim:

Swift 3.0/4.0

let image = UIImage(named: "YourImage", in: Bundle(for: YOURFRAMEWORKCLASS.self), compatibleWith: nil)

Alternatif olarak, bu şablonu -class olmayan, "statik olmayan" işlevler için de kullanabilirsiniz:

let image = UIImage(named: "YourImage", in: Bundle(for: type(of: self)), compatibleWith: nil)

veya class işlevleri için bu şablon:

let image = UIImage(named: "YourImage", in: Bundle(for: self), compatibleWith: nil)

Bu alternatifler kesme ve yapıştırma için daha iyidir.

60
Daniel

UIImage ("Background.png" olarak adlandırılır), iç dizinlerde NSBundle.mainBundle () öğesini çağırır. Bu nedenle, kodunuz çerçeveler paketinde değil, Ana Bilgisayar uygulamanızın paketinde kaynak bulmaya çalışıyor. UIImage'ı çerçevenizdeki paketten yüklemek için bu pasajı kullanın:

let frameworkBundle = NSBundle(forClass: YOURFRAMEWORKCLASS.self)
let imagePath = frameworkBundle.pathForResource("yourImage.png", ofType: "")
if imagePath != nil {
  result = UIImage(contentsOfFile: imagePath!)
}

Düzenlendi: açıklama eklendi (milz'e thx)

12
Renatus

Swift 3.0'da: 

let currentBundle = Bundle(for: YOURCLASS.self)
guard let path = currentBundle.path(forResource: imageName, ofType: "jpg") else {  return defaultImage }
return UIImage(contentsOfFile: path) ?? defaultImage
2
NatashaTheRobot

Diğer bir seçenek, okunabilirlik söz konusu olduğunda sınıf atamaktan daha anlamlı olan paket tanımlayıcısının atanmasıdır.

Swift 3'te :

UIImage(named: "MyImage", in: Bundle(identifier: "bundleIdentifier"), compatibleWith: nil)
2
Brian

Kabul edilen cevap benim için işe yaramadı. İşte dinamik bir çerçeveye gömülü bir görüntüyü yüklemek için aptalca bir yol:

    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)
0
Sakiboy