Xcode中的vector图像如何工作(即PDF文件)?
Xcode 6中的vector支持如何工作?
当我尝试调整图像的大小时,看起来锯齿状,是什么给了?
如何在Xcode中使用vector(7和6.3+):
- 以适当的@ 1x大小(例如44×44的工具栏button)将图像保存为.pdf文件。
- 在您的Images.xcassets文件中,创build一个新的图像集 。
- 在“ 属性”检查器中 ,将“ 缩放因子”设置为“ 单个vector” 。
- 拖放您的PDF文件到全部,通用部分。
-
你现在可以通过它的名字来引用你的图片,就像任何.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:
- 创build一个新的项目。
- 转到文件>文档属性,并将自定义页面大小设置为您的@ 1x大小(44×44,100×100等)与px中的单位。
- 制作你的作品。
- 转到文件>另存为…>可打印文档格式(* .pdf)>保存>确定。 (或者,您可以转到打印>打印到文件>输出格式:PDF>打印,但没有那么多的选项。)
笔记:
- 正如在接受的答案中提到的,你不能调整图像的大小,因为Xcode在构build时仍然会产生光栅化的图像。 如果您需要调整图像大小,您应该创build一个不同大小的新.pdf文件。
-
如果您已经具有错误页面大小的.svg图像,请执行以下操作:
- 更改页面大小(Inkscape>文件>文档属性)
- 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 } }
}