带有 UIImage 的 Swift Playgrounds
Posted
技术标签:
【中文标题】带有 UIImage 的 Swift Playgrounds【英文标题】:Swift playgrounds with UIImage 【发布时间】:2014-06-05 20:16:53 【问题描述】:我正在使用 Xcode 6,我正在尝试重新创建在会话 401“Xcode 6 中的新功能”期间演示的代码。我已将图像添加到 Images.xcassets(称为 Sample),并且在 Playground 文件中我正尝试访问此图像,如演示所示。
我的代码如下(和demo一样):
var sample = UIImage(named: "Sample")
但是,我无法让它像演示那样工作。我错过了什么吗?
【问题讨论】:
演示是做什么的? 图片是直接在bundle里面吗? 【参考方案1】:查看ios开发者库->Playground Help搜索“资源文件”即可找到答案
1、打开.playground
2、通过选择 View > Navigator > Show Project Navigator 来显示 Project navigator。
3、将图片拖到资源中
点赞:
【讨论】:
我赞成,但有人知道为什么它不适用于 pdf 文件吗?最简单的(可能只有从xCode 8开始),只需将图像文件拖到代码上,它将自动添加,您可以直接使用UIImage(但不要忘记像我一样的扩展名;) 注意:不要忘记添加扩展名,否则你会得到零。 这对我不起作用。我的资源文件夹是灰色的。 不要忘记在写图片名称时不要遗漏 .jpg 或 .png ,如上所示。我这样做了,想知道为什么它不起作用。 Xcode 11 beta 5 第 4 步:将图像从资源文件夹拖到您的代码中,您将获得一个工作图像文字。【参考方案2】:-
在 Finder 中打开 .playground 文件。
在旁边创建一个名为 Resources 的文件夹。
将您想要的任何图像添加到此文件夹。
在操场上按 opt-cmd-1 打开文件检查器。你应该看到右边的操场。如果您没有选择它,请按 cmd-1 打开 Project Navigator 并单击 Playground 文件。
-
在“资源路径”下选择“相对于游乐场”
点击下方的文件夹图标,选择之前创建的 Resources 文件夹。
您现在应该有一个可以与标准 NSImage 一起使用的包(命名为:“filename_without_extension”):
注意:因为 Xcode 会经常覆盖 .playground 文件夹,所以我建议使用这种方法,这样资源文件夹就不会被不断地删除和重新创建。
【讨论】:
感谢您的回复。我试图遵循这一点,但我看不到“相对于游乐场”选项。我只有“绝对路径,相对于组,相对于项目,相对于开发者目录,相对于构建产品,相对于 SDK”。 这是“位置”下拉菜单。您想要在 Playground Settings 下名为“Resource Path”的下拉菜单。 为什么不使用“内部游乐场”而不是“相对于游乐场”?第一个更简单,适合我。 我认为最新的 Xcode 测试版一定改变了这一点,因为资源路径不再有下拉菜单【参考方案3】:我也遇到了一些麻烦。
不幸的是,克里斯的回答对我不起作用。我怀疑 Xcode 6 的后续 beta 版本可能已经删除了这个设置。
这是 2014 年 7 月 21 日可用的 Xcode 6.0 beta 4 (6A267N) 的解决方案。我猜这对应于之前的“Inside playground”选项。这就是 Playground 包中的 Resources 文件夹所在的位置。
这是设置方法。
使用 Finder - 或者如果您像我一样使用很棒的 Path Finder - 右键选择并选择 显示包内容,如下所示:
这会显示包 Resources 文件夹:
将图像文件复制到该文件夹中即可:
let imageNames = ["back-button", "background", "bg_top"]
let images = imageNames.map UIImage(named: $0)
【讨论】:
谢谢!!这似乎是现在唯一的方法。这应该被标记为正确的答案(直到一个新的测试版也打破了这个......)【参考方案4】:对于 Xcode 9:
选择资源文件夹 右键单击然后“将文件添加到“资源”” 像这样使用它:let image = UIImage(named: "no")
【讨论】:
【参考方案5】:从 Xcode 8 Beta 1 开始,您可以使用 Image Literals 将图像导入 Xcode Playground:
开始输入image
以添加图像文字:
选择(或浏览)您的图片:
查看内嵌图片:
【讨论】:
【参考方案6】:但是,我无法让它像演示那样工作。我错过了什么吗?
我不确定您需要将图像放在哪里才能仅使用名称来引用它,但通过指定图像的完整路径,我得到了相同的代码,例如:
var sample = UIImage(named: "/Users/my_user_name/Desktop/Image1234.jpg")
必须使用完整路径似乎比应有的复杂得多,但它确实有效,它让我可以继续解决更有趣的问题。
【讨论】:
我注意到演示的“资源路径”设置为“内部游乐场”,但即使复制了我在演示屏幕截图中可以看到的所有设置,我也无法让它工作. 感谢 Celeb,您的解决方案有效。虽然很高兴知道将图像放在哪里以通过名称而不是路径来引用它。【参考方案7】:您可以在 Playground 中使用这些命令找出 resourcePath 的路径:
var bundle = NSBundle.mainBundle()
var path = bundle.resourcePath
我的默认设置是:
/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Agents
【讨论】:
【参考方案8】:我很难为 iOS 游乐场设置此设置,而不是 OS X 游乐场。尝试使用包和相对路径来实现它会变得更加复杂。
如果你只是想快速上手一张图片,你也可以使用绝对文件路径:
在 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)
【讨论】:
出于某种原因,我遇到了一些麻烦。我的错误是:“执行被中断,原因:EXC_BAD_ACCESS(代码=1,地址=0x0)。”有什么想法吗? 是的,我注意到了同样的事情。他们改变了一些东西,至少从 Xcode6-Beta6 开始,因此在 iOS 操场上,您不能使用 UIImage(contentsOfFile:) 来使用绝对路径抓取图像。我不确定这是否是由于文件系统沙箱、错误或其他更微妙的原因而导致的预期行为。【参考方案9】:这在 Xcode 版本 6.1.1 上对我有用。
在与主故事板相同的目录下创建 Playground 文件。
打开 Playground 文件的实用程序窗格,然后单击 Resource Path
部分中的右箭头将图像添加到该目录中。
在 Playground 文件中测试图像。
【讨论】:
【参考方案10】:在带有 XCode 6 beta 5(可能更高版本)的 iOS 操场上,您可以在包中看到图像:
-
在操场上按 Cmd+Opt+1 并单击资源路径下的箭头(这将打开 Finder)
把你的图片放到这个文件夹里
使用任一方式访问它
let img = UIImage(named: "logo.png", inBundle: NSBundle.mainBundle(),
compatibleWithTraitCollection: nil)
或
let path = NSBundle.mainBundle().pathForResource("logo", ofType: "png")
let img = UIImage(contentsOfFile:path)
或在 Swift 4 中:
let path = Bundle.main.path(forResource:"logo", ofType: "png")
let img = NSImage(contentsOfFile:path!)
【讨论】:
这对我有用,并且避免了我一直得到的 BAD_ACCESS【参考方案11】:使用 XCode 6.3.1 并在完整的模拟器 (iOS) 中运行 Playground 我必须执行以下操作:
-
在 finder 中找到您的 .playground 文件
右键单击它 -> 显示包内容
如果不存在,请在包内创建一个名为 Resources 的文件夹
在此处添加您的图片
然后只需实例化
let i = UIImage(named: "filename.png")
【讨论】:
【参考方案12】:我不知道为什么它不能以简单的方式处理 PDF 图像。
我必须添加此扩展程序才能将 PDF 图像加载到我的 Playground 中:
extension UIImage
static func fromPDF(_ url: URL) -> UIImage?
var image: UIImage?
guard
let doc = CGPDFDocument(url as CFURL),
let page = doc .page(at: 1)
else return nil
let pageRect = page.getBoxRect(.mediaBox)
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
image = renderer.image ctx in
UIColor.clear.set()
ctx.fill(pageRect)
ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
ctx.cgContext.drawPDFPage(page)
return image
// Given the file "myImage.pdf" was added to your Playground's Resources folder.
let image = UIImage.fromPDF(#fileLiteral(resourceName: "myImage.pdf"))
基于此:https://developer.apple.com/forums/thread/90990
【讨论】:
以上是关于带有 UIImage 的 Swift Playgrounds的主要内容,如果未能解决你的问题,请参考以下文章