Swift playgrounds中使用UIImage

62

我正在使用 Xcode 6 工作,试图重现在“Xcode 6 有什么新功能”会议中演示的代码。我已将图像添加到 Images.xcassets(称为 Sample),并尝试在 playground 文件中访问此图像,就像演示的那样。

我的代码如下(类似于演示):

var sample = UIImage(named: "Sample")

然而,我无法使它像演示一样正常工作。我是否遗漏了什么?


演示做什么? - 67cherries
图片直接在捆绑包中吗? - zaph
12个回答

113

请查看iOS开发人员文库->Playground Help并搜索“资源文件”,您将找到答案。

1、打开 .playground 文件。

2、通过选择 View > Navigators > Show Project Navigator 来显示项目导航器。

3、将图像拖动到 Resources 中。

如下所示:

enter image description here


4
我点赞,但有人知道为什么它不能与PDF文件一起使用吗?最简单的方法(也许只有自从xCode 8以来),只需将图像文件拖到代码上,它将自动添加,然后您可以直接使用UIImage(但不要像我一样忘记扩展名 ;))。 - Dam
1
注意:不要忘记添加扩展名,否则会返回空值。 - Jerome
3
这对我没有用。我的资源文件夹是灰色的。 - Alex Bollbach
在编写图像名称时,不要像上面所示那样忘记加上 .jpg 或 .png。我曾经犯过这个错误,一直想知道为什么它不起作用。 - user7097242
Xcode 11 beta 5 第四步:将图像从资源文件夹拖入代码中,即可获得一个可用的图像字面量。 - heyfrank
对于Xcode 12.5.1,我需要添加“import PlaygroundSupport”。请参阅此较新的SO帖子:https://dev59.com/u6Tia4cB1Zd3GeqP-0Ke - Rethunk

69
  1. 在Finder中打开.playground文件。
  2. 创建一个名为Resources的文件夹,与它相邻。
  3. 将任何你想要添加的图像放入此文件夹。
  4. 在playground中按opt-cmd-1打开“文件检查器”。你应该看到右边的playground。如果没有选中它,请按cmd-1打开“项目导航器”并单击playground文件。

File Inspector

  1. 在“资源路径”下选择“相对于Playground”。
  2. 点击下面的文件夹图标,选择先前创建的Resources文件夹。

现在你应该拥有一个bundle,可以通过标准的NSImage(named:"filename_without_extension")来使用它:

Working nsbundle image

注意:因为Xcode经常会覆盖.playground文件夹,所以我建议使用这种方法,这样资源文件夹就不会被不断删除和重新创建。


1
谢谢您的回复。我尝试按照这个方法操作,但是我找不到“相对于游乐场”的选项。我只看到了“绝对路径、相对于组、相对于项目、相对于开发者目录、相对于构建产品、相对于SDK”这些选项。 - Ross Gibson
那是“位置”下拉菜单。您想要该下拉菜单下面的名为“资源路径”的游乐场设置。 - Chris Hill
为什么不用“Inside Playground”而是“Relative to Playground”?第一个更简单,对我来说也有效。 - maltalef
37
我认为最新的Xcode beta版本一定做了改动,因为现在没有资源路径的下拉菜单了。 - Max MacLeod

32

我也遇到了一些问题。

不幸的是,Chris的答案对我无效。我怀疑Xcode 6的某个后期beta版本可能已经删除了此设置。

以下是截至2014年7月21日可用的Xcode 6.0 beta 4(6A267N)的解决方案。我猜这对应于先前的“内部游乐场”选项。也就是说,资源文件夹位于游乐场包本身内部。

以下是如何设置它。

使用Finder - 或者如果您像我一样使用强大的Path Finder- 右键选择并选择显示包内容,如下所示:

enter image description here

这将显示Resources文件夹:

enter image description here

将图像文件复制到该文件夹即可。

let imageNames = ["back-button", "background", "bg_top"]
let images = imageNames.map { UIImage(named: $0) }

在此输入图片描述


2
谢谢!现在看起来似乎只有这种方法可行。这应该标记为正确答案(直到新的测试版也破坏了这个方法...) - empee

13

对于Xcode 9:

  • 选择资源文件夹
  • 右键点击,然后选择“添加文件到“资源”
  • 使用方法如下: let image = UIImage(named: "no")

输入图像描述


4
从Xcode 8 Beta 1开始,您可以使用Image Literals将图像导入到Xcode playground中:
输入image以添加图像文字:

Swift Image Literal

选择(或浏览)您的图像:

Image

查看您的内联图片:

Inline


3

然而,我无法像演示一样使其工作。我是不是遗漏了什么?

我不确定您需要将图像放在何处,才能仅使用名称引用它,但是我通过指定图像的完整路径来使相同的代码工作,例如:

var sample = UIImage(named: "/Users/my_user_name/Desktop/Image1234.jpg")

不得不使用完整路径似乎比应该的复杂,但它可以让我继续解决更有趣的问题。


我注意到演示中的“资源路径”设置为“Inside Playground”,但即使复制我在演示截图中看到的所有设置,我也无法让它正常工作。 - Ross Gibson
谢谢Celeb,你的解决方案很有效。虽然知道将图像放在哪里以便通过名称而不是路径引用它会更好。 - Ross Gibson

3
您可以在playground中使用以下命令来查找resourcePath的路径:
var bundle = NSBundle.mainBundle()
var path = bundle.resourcePath

对我来说,默认设置是:

/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Agents

3

相对于OS X playground,我在iOS playground中设置时遇到了困难。尝试使用bundle和相对路径会使它变得更加复杂。

如果你只想快速获取图像,也可以直接使用绝对文件路径:

iOS上:

# iOS
let absoluteImagePath = "/absolute/path/to/image.png"
let image = UIImage(contentsOfFile: absoluteImagePath)

在 OS X 上
# OS X
let absoluteImagePath = "/absolute/path/to/image.png"
let image = NSImage(contentsOfFile: absoluteImagePath)

3
由于某些原因,我在处理这个问题时遇到了一些麻烦。我的错误提示是:“执行被中断,原因:EXC_BAD_ACCESS(code=1,address=0x0)。” 你有什么想法吗? - camleng
3
是的,我也注意到了同样的情况。自从Xcode6-Beta6以来,他们改变了一些东西,因此在iOS playground中,您不能使用UIImage(contentsOfFile:)通过绝对路径获取图像。我不确定这是由于文件系统沙盒、错误或其他更微妙的原因导致的预期行为。 - algal

2
这是我在Xcode 6.1.1版本上的解决方法。
  1. 在与主要storyboard同一目录下创建Playground文件。

    Folder Structure

  2. 打开Playground文件的Utilities面板,并单击“Resource Path”部分的右箭头,将您的图像添加到该目录中。

    Resource Path for Playground

  3. 在Playground文件中测试图象。

    Result


2
在使用XCode 6 beta 5 (以及后续版本) 的iOS playground中,您可以看到bundle中的图像:
  1. In the playground press Cmd+Opt+1 and click the arrow under the Resource Path (this will open Finder)
  2. Put your picture to this folder
  3. Access it with either

    let img = UIImage(named: "logo.png", inBundle: NSBundle.mainBundle(),
                      compatibleWithTraitCollection: nil)
    

    or

    let path = NSBundle.mainBundle().pathForResource("logo", ofType: "png")
    let img = UIImage(contentsOfFile:path)
    

    or in Swift 4:

    let path = Bundle.main.path(forResource:"logo", ofType: "png")
    let img = NSImage(contentsOfFile:path!)
    

1
这对我起作用了,并避免了我之前一直遇到的BAD_ACCESS问题。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接