带有 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的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 NSData 并返回 UIImage (Swift)

UIImage 显示为不透明的正方形(IOS Swift)

多部分请求 - 带有 UIImage 的可编码结构

在 Swift 中上传带参数的图像

带有世界地图的uiimageview上的Swift绘图坐标

swift基本语法--变量常量字面量