使用 contentsOfFile 的 UIImage

UIImage using contentsOfFile

我正在使用

self.imageView.image = UIImage(named: "foo.png")

到 select 并在 UIIMageView 中加载图像。我的应用程序中的图像位于 images.xcassets 下。问题是这个特定的 init 根据 official Apple documentation:

缓存图像以供重用

If you have an image file that will only be displayed once and wish to ensure that it does not get added to the system’s cache, you should instead create your image using imageWithContentsOfFile:. This will keep your single-use image out of the system image cache, potentially improving the memory use characteristics of your app.

我的视图允许在 select 查看图像之前循环浏览图像,因此内存占用会随着我循环浏览而不断增加,即使我从该视图导航回来也不会下降。

所以我正在尝试使用不缓存图像的 UIIMage(contentsOfFile: "path to the file")。在这里,我无法以编程方式获取存储在 images.xcassets 下的图像的路径。

我试过使用:

NSBundle.mainBundle().resourcePath

NSBundle.mainBundle().pathForResource("foo", ofType: "png")

运气不好。对于第一个,我得到了 resourcePath,但是在通过终端访问它时,我没有看到它下面有任何图像资源,而第二个我在使用它时得到了 nil。有没有简单的方法可以做到这一点?

还查看了几个 SO 问题(如 this, this and this),但没有成功。我是否必须将图像放在其他地方才能使用 pathForResource()?解决这个问题的正确方法是什么?

很难想象以前没有人遇到过这种情况:) !

如果您需要使用 pathForResource() 来避免图像缓存,则无法使用 images.xcassets。在这种情况下,您需要在 XCode 中创建组,并在那里添加图像(确保该图像被复制到 Copy Bundle Resources)。然后写:

Swift 5:

let bundlePath = Bundle.main.path(forResource: "imageName", ofType: "jpg")
let image = UIImage(contentsOfFile: bundlePath!)

年长 Swift:

let bundlePath = NSBundle.mainBundle().pathForResource("imageName", ofType: "jpg") 
let image = UIImage(contentsOfFile: bundlePath!) 

当您从图像组资源中实现图像数组时,您可以将每个图像(比方说 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!)
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)