矢量支持如何在Xcode 6中工作?
当我尝试调整图像大小时,它看起来是锯齿状的,是什么给出了?
答案 0 :(得分:338)
您现在可以按名称引用图片,就像使用任何 .png 文件一样。
UIImage(named: "myImage")
Xcode中的矢量支持令人困惑,因为当大多数人想到矢量时,他们会想到可以向上和向下扩展但仍然看起来很好的图像。但是,Xcode 6和7并没有为iOS提供完整的矢量支持,因此工作方式略有不同。
矢量系统非常简单。它需要您的.pdf
图片,并在构建时创建@1x.png
,@2x.png
和@3x.png
资产。 (您可以use a tool to examine the contents of Assets.car验证这一点。)
例如,假设您获得foo.pdf
这是44x44矢量资产。在构建时间,它将生成以下文件:
foo@1x.png
at 44x44 foo@2x.png
at 88x88 foo@3x.png
,电话:132x132 对于任何尺寸的图像,这都是相同的。例如,如果您的bar.pdf
为100x100,您将获得:
bar@1x.png
,100x100 bar@2x.png
200x200 bar@3x.png
at 300x300 答案 1 :(得分:21)
答案 2 :(得分:14)
这是对@Senseful的优秀答案的补充。
我将告诉你如何在Inkscape中执行此操作,因为它是免费和开源的,但其他程序应该类似。
在Inkscape中:
备注:强>
如果您的.svg图片页面大小错误,请执行以下操作:
要将.svg文件转换为.pdf,您还可以找到在线实用程序来为您完成工作。来自Here is one example的this answer。这样可以让您轻松设置.pdf大小。
答案 3 :(得分:7)
对于那些仍未更新的人,Xcode 9(iOS 11)中有变化。
Cocoa Touch的新变化(WWDC 2017 Session 201)(@ 32:55) https://developer.apple.com/videos/play/wwdc2017/201/
简而言之,资产目录现在包含名为“保存矢量数据”的属性检查器中的新复选框。选中后,PDF数据将包含在已编译的二进制文件中,当然会增加其大小。但它为iOS提供了在两个方向上缩放矢量数据并提供漂亮图像的机会。(有其自身的困难)。 对于低于11的iOS,使用了向上答案中描述的旧缩放机制。
答案 4 :(得分:1)
您可以将项目中的普通PDF文件用作矢量图像,并使用此扩展名渲染任意大小的图像。这种方式更好,因为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
}
}
}