Xcode中的vector图像如何工作(即PDF文件)?

Xcode 6中的vector支持如何工作?

当我尝试调整图像的大小时,看起来锯齿状,是什么给了?

如何在Xcode中使用vector(7和6.3+):

  1. 以适当的@ 1x大小(例如44×44的工具栏button)将图像保存为.pdf文件。
  2. 在您的Images.xcassets文件中,创build一个新的图像集
  3. 在“ 属性”检查器中 ,将“ 缩放因子”设置为“ 单个vector”
  4. 拖放您的PDF文件到全部,通用部分。
  5. 你现在可以通过它的名字来引用你的图片,就像任何.png文件一样。

    UIImage(named: "myImage") 

如何在旧版本的Xcode(6.0 – 6.2)中使用向量:

  • 按照上面的步骤,除了第3步,将types设置为vector

Xcode中的vector如何工作

向量支持在Xcode中是令人困惑的,因为当大多数人想到vector时,他们会想到可以放大和缩小的图像,并且仍然很好看。 但是,Xcode 6和7没有iOS的全部vector支持,所以情况有些不同。

vector系统非常简单 。 它需要您的.pdf图像,并在构build时创build@1x.png@2x.png@3x.png资源。 (您可以使用工具来检查Assets.car的内容以validation这一点。)

例如,假设您获得了一个44x44vector资产foo.pdf。 在构build时它将生成以下文件:

  • foo@1x.png在44×44
  • foo@2x.png在88×88
  • foo@3x.png在132×132

这适用于任何大小的图像。 例如,如果您的bar.pdf是100×100,您将得到:

  • bar@1x.png在100×100
  • bar@2x.png ,200×200
  • bar@3x.png在300×300

启示:

  • 您无法为图片select新的尺寸 ; 它只会看起来不错,如果你保持在44×44的大小。 原因是全vector支持没有实现 。 这些向量做的唯一的事就是节省你保存图像资源的时间。 如果你有一个工具(例如一个Photoshop脚本)已经使这一步的过程,你将通过使用PDFvector唯一的事情是未来的支持 (例如,如果在iOS 9苹果开始要求@ 4倍的资产,这些将会起作用),并且您将拥有更less的文件来维护
  • 您应该要求@ 1x大小的所有资产,保存为PDF文件 。 除此之外,这将允许UIImageView具有正确的内在内容大小。

为什么它(可能)这样工作:

  • 这使它与以前的iOS版本向后兼容
  • 调整vector的大小可能是运行时的计算密集型任务; 通过这种方式实现, 没有性能命中

在Xcode 8中,您仍然可以添加pdf,创build一个新的图像集,并在属性检查器中将缩放比例设置为单一比例选项。 在这里输入图像描述

这是@Senseful的优秀答案的补充。

如何使.pdf格式的vector图像

我会告诉如何在Inkscape中做到这一点,因为它是免费的,开源的,但其他程序应该是类似的。

Inkscape:

  1. 创build一个新的项目。
  2. 转到文件>文档属性,并将自定义页面大小设置为您的@ 1x大小(44×44,100×100等)与px中的单位。
  3. 制作你的作品。
  4. 转到文件>另存为…>可打印文档格式(* .pdf)>保存>确定。 (或者,您可以转到打印>打印到文件>输出格式:PDF>打印,但没有那么多的选项。)

笔记:

  • 正如在接受的答案中提到的,你不能调整图像的大小,因为Xcode在构build时仍然会产生光栅化的图像。 如果您需要调整图像大小,您应该创build一个不同大小的新.pdf文件。
  • 如果您已经具有错误页面大小的.svg图像,请执行以下操作:

    1. 更改页面大小(Inkscape>文件>文档属性)
    2. select工作空间中的所有对象(Ctrl + A)并调整它们以适应新的页面大小。 (按住Ctrl保持宽高比。)
  • 要将.svg文件转换为.pdf,您还可以find在线实用程序来为您完成这项工作。 这是来自这个答案的 一个例子 。 这有利于您轻松设置.pdf大小。

进一步阅读

  • 在Xcode 6中使用vector图像

您可以将项目中的普通PDF文件用作vector图像,并使用此扩展名呈现任何大小的图像。 这种方式更好,因为iOS不会从您的PDF文件中生成.PNG图像,而且您可以使用任意大小渲染图像:

 extension UIImage { static func fromPDF(filename: String, size: CGSize) -> UIImage? { guard let path = Bundle.main.path(forResource: filename, ofType: "pdf") else { return nil } let url = URL(fileURLWithPath: path) guard let document = CGPDFDocument(url as CFURL) else { return nil } guard let page = document.page(at: 1) else { return nil } let imageRect = CGRect(x: 0, y: 0, width: size.width, height: size.height) if #available(iOS 10.0, *) { let renderer = UIGraphicsImageRenderer(size: size) let img = renderer.image { ctx in UIColor.white.withAlphaComponent(0).set() ctx.fill(imageRect) ctx.cgContext.translateBy(x: 0, y: size.height) ctx.cgContext.scaleBy(x: 1.0, y: -1.0) ctx.cgContext.concatenate(page.getDrawingTransform(.artBox, rect: imageRect, rotate: 0, preserveAspectRatio: true)) ctx.cgContext.drawPDFPage(page); } return img } else { // Fallback on earlier versions UIGraphicsBeginImageContextWithOptions(size, false, 2.0) if let context = UIGraphicsGetCurrentContext() { context.interpolationQuality = .high context.setAllowsAntialiasing(true) context.setShouldAntialias(true) context.setFillColor(red: 1, green: 1, blue: 1, alpha: 0) context.fill(imageRect) context.saveGState() context.translateBy(x: 0.0, y: size.height) context.scaleBy(x: 1.0, y: -1.0) context.concatenate(page.getDrawingTransform(.cropBox, rect: imageRect, rotate: 0, preserveAspectRatio: true)) context.drawPDFPage(page) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } return nil } } 

}