使ってます
self.imageView.image = UIImage(named: "foo.png")
UIIMageView
で画像を選択してロードします。アプリの_images.xcassets
_の下に画像があります。問題は、この特定のinit
がイメージをキャッシュして再利用できるようにすることです 公式Appleドキュメント :
一度だけ表示される画像ファイルがあり、それがシステムのキャッシュに追加されないようにしたい場合は、代わりにimageWithContentsOfFile:を使用して画像を作成する必要があります。これにより、シングルユースイメージがシステムイメージキャッシュから除外され、アプリのメモリ使用特性が向上する可能性があります。
私のビューでは、画像を選択する前に画像を循環させることができるため、循環するにつれてメモリフットプリントが増加し続け、そのビューから戻ってもメモリフットプリントが減少することはありません。
だから私は画像をキャッシュしないUIIMage(contentsOfFile: "path to the file")
を使おうとしています。ここでは、images.xcassetsに保存した画像のパスをプログラムで取得するのに問題があります。
私は使用してみました:
NSBundle.mainBundle().resourcePath
そしてNSBundle.mainBundle().pathForResource("foo", ofType: "png")
運がない。最初のものではresourcePathを取得しますが、ターミナルからアクセスすると、その下に画像アセットが表示されません。2番目のものでは、使用するとnil
が取得されます。これを行う簡単な方法はありますか?
また、いくつかのSO質問( this 、 this 、 this など)など)を運が悪かったので調べました。 pathForResource()
を使用できるようにするには、画像を別の場所に配置する必要がありますか?これを実行する正しい方法は何ですか?
これまで誰もこのシナリオに遭遇したことがないことを想像するのは難しいです:)!
画像のキャッシュを回避するためにpathForResource()を使用する必要がある場合、images.xcassetsを操作することはできません。その場合、XCodeでグループを作成し、そこに画像を追加する必要があります(必ず、その画像はCopy Bundle Resourcesにコピーされます)。その後、次のように記述します。
var bundlePath = NSBundle.mainBundle().pathForResource("imageName", ofType: "jpg")
var image = UIImage(contentsOfFile: bundlePath!)
import Foundation
import UIKit
enum UIImageType: String {
case PNG = "png"
case JPG = "jpg"
case JPEG = "jpeg"
}
extension UIImage {
convenience init?(contentsOfFile name: String, ofType: UIImageType) {
guard let bundlePath = Bundle.main.path(forResource: name, ofType: ofType.rawValue) else {
return nil
}
self.init(contentsOfFile: bundlePath)!
}
}
使用する:
let imageView.image = UIImage(contentsOfFile: "Background", ofType: .JPG)
画像グループリソースから画像の配列を実装する場合、各画像(たとえば、b1、b2、b3、b4、b5)を次のようにロードできます。
var imageIndex = 0
lazy var imageList = ["b1","b2","b3","b4","b5"]
let imagePath = Bundle.main.path(forResource: imageList[imageIndex], ofType: "jpg")
imageview.image = UIImage(contentsOfFile: imagePath!)