【问题标题】:Getting asset catalog path for image using UIImage(contentsOfFile:)使用 UIImage(contentsOfFile:) 获取图像的资产目录路径
【发布时间】:2019-05-26 14:37:25
【问题描述】:

当您将图像从桌面拖到 Xcode 中的资产目录中时,您可以使用以下方式在项目中访问该图像:

UIImage(named: "somePNG")

但是如何使用 UIImage(contentsOfFile:) 访问该图像?

if let path = Bundle.main.path(forResource: "somePNG", ofType: "png") {
    someImageView.image = UIImage(contentsOfFile: path)
}

上面的代码不起作用。文件检查器中的图像被添加到目标中。我错过了什么?

【问题讨论】:

  • 不要将图像添加到资产中,将其添加到项目文件夹中,就像将 swift 文件添加到项目中一样
  • 在没有资产目录的情况下如何处理不同的比例因子(@2x、@3x)?在图像文件末尾附加@2x 就足够了吗?
  • 那么有没有办法使用这种方法来使用单独的 2x 和 3x 图像呢?因为对于清晰度,它确实很重要。
  • 没问题,使用命名约定。

标签: ios swift


【解决方案1】:

为什么要使用UIImage(contentsOfFile:) 而不是UIImage(named:)?原因可能是您希望可以从资产目录加载图像而不自动缓存它。你不能。 (我认为这是资产目录工作方式中的一个主要错误。)您必须将图像存储在应用程序包的根级别,就像我们在资产目录存在之前所做的那样。

如果您根据命名约定命名与分辨率相关的文件,例如myFile.pngmyFile@2x.pngmyFile@3x.png,那么当你使用你的代码时,正确的事情就会发生已与名称 "myFile.png" 一起显示。

【讨论】:

  • 在实践中,是否值得对标签栏中的图像执行此操作或在启动时显示一次?因为如果程序需要更多内存,它无论如何都会转储图像缓存,并且图像本身不会从屏幕上消失。或者将缓存图像与非缓存图像分开是否明智?
  • 等等等等。那不是你问的问题。您没有询问使用contentsOfFile: 是否值得。您问如何使用contentsOfFile:。实际上,对于标签栏中的图像之类的东西,使用资产目录有效。但如果你想知道这件事,你应该问那个。 (有一个关于图像效率的 WWDC 2018 视频;建议您观看。)
  • 这就是我在评论中问它的原因,作为主要问题的旁白。好吧,现在我的问题是何时使用contentsOfFile:,但恐怕这不是关于 SO 的问题,所以我将开始搜索。立即观看视频,感谢推荐。
  • 问题是所有这些都已经在这里进行了彻底的讨论和解释。你应该搜索,而不是问一些老生常谈的问题。你的问题是这些问题的重复,例如stackoverflow.com/questions/22856283/…,并且真的应该在一开始就被关闭。
【解决方案2】:

如果图片存在于xcassets,则无法通过contentsOfFile访问,需要将其添加到项目文件中,并启用复制选项

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 2013-11-29
    • 2014-05-01
    • 1970-01-01
    • 2019-08-31
    • 2019-03-12
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多