向量支持在Xcode 6中如何工作?
当我尝试调整图像大小时,它看起来参差不齐,这有什么用?
Answers:
现在,您可以通过图像名称来引用图像,就像处理任何.png文件一样。
UIImage(named: "myImage")
在Xcode中,向量支持令人困惑,因为当大多数人想到向量时,他们就会想到可以放大和缩小并仍然看起来不错的图像。但是,Xcode 6和7没有对iOS的完整矢量支持,因此工作原理有所不同。
向量系统非常简单。这需要你的.pdf
形象,并创建@1x.png
,@2x.png
以及@3x.png
资产在构建时。(您可以使用工具检查Assets.car的内容以进行验证。)
例如,假设您给出foo.pdf
了44x44矢量资产。在构建时,它将生成以下文件:
foo@1x.png
在44x44foo@2x.png
在88x88foo@3x.png
在132x132这对于任何大小的图像都相同。例如,如果您具有bar.pdf
100x100,则将获得:
bar@1x.png
在100x100bar@2x.png
在200x200bar@3x.png
在300x300resizableImageWithCapInsets:
并将切片值除以[UIScreen mainScreen].scale
CGFloat scale = [UIScreen mainScreen].scale; UIImage *image = [[UIImage imageNamed:@"my_unsliced_asset"] resizableImageWithCapInsets:UIEdgeInsetsMake(10 * scale, 11 * scale, 12 * scale, 13 * scale)];
这是@Senseful出色回答的补充。
我将告诉您如何在Inkscape中执行此操作,因为它是免费的开放源代码,但其他程序也应该类似。
在Inkscape中:
笔记:
如果您已经具有错误的页面大小的.svg图像,请执行以下操作:
要将.svg文件转换为.pdf,您还可以找到在线实用程序来为您完成这项工作。下面是一个例子,从这个答案。这样的好处是允许您轻松设置.pdf大小。
对于仍未更新的用户,Xcode 9(iOS 11)有所更改。
Cocoa Touch(WWDC 2017 Session 201)(@ 32:55)的新功能 https://developer.apple.com/videos/play/wwdc2017/201/
简而言之,资产目录现在在属性检查器中包括名为“保留矢量数据”的新复选框。选中后,PDF数据将包含在已编译的二进制文件中,当然会增加其大小。但这为iOS提供了在两个方向上缩放矢量数据并提供精美图像的机会(有其自身的困难)。对于11以下的iOS,使用向上答案中描述的旧缩放机制。
您可以在项目内部将普通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
}
}
}