Xcode 6でベクターサポートはどのように機能しますか?
画像のサイズを変更しようとすると、ギザギザに見えますが、何が得られますか?
任意の。pngファイルと同じように、名前で画像を参照できるようになりました。
UIImage(named: "myImage")
Xcodeではベクターのサポートはわかりにくいです。なぜなら、ほとんどの人がベクターについて考えるとき、彼らは拡大縮小することができ、見栄えの良い画像を考えるからです。ただし、Xcode 6および7はiOSのベクターを完全にサポートしていないため、動作は少し異なります。
ベクトルシステムは本当にシンプルです。 .pdf
イメージを取得し、build timeで@1x.png
、@2x.png
、および@3x.png
アセットを作成します。 ( Assets.carの内容を調べるツールを使用 これを確認できます。)
たとえば、44x44のベクトル資産であるfoo.pdf
が与えられたと仮定します。 build timeで、次のファイルを生成します。
[email protected]
at 44x44[email protected]
at 88x88[email protected]
at 132x132これは、どのサイズの画像でも同じように機能します。たとえば、100x100のbar.pdf
がある場合、次のようになります。
[email protected]
at 100x100[email protected]
at 200x200[email protected]
at 300x300これは、@ Sensefulによる優れた答えの補足です。
Inkscapeは無料でオープンソースですが、他のプログラムも同様であるため、Inkscapeでこれを行う方法を説明します。
Inkscapeでは:
注:
間違ったページサイズの.svg画像が既にある場合は、次の手順を実行します。
.svgファイルを.pdfに変換するには、オンラインユーティリティを使用してジョブを実行することもできます。 ここに1つの例があります from この答え 。これには、.pdfサイズを簡単に設定できるという利点があります。
まだ更新していない人のために、Xcode 9(iOS 11)に変更がありました。
Cocoa Touchの新機能(WWDC 2017セッション201)(@ 32:55) https://developer.Apple.com/videos/play/wwdc2017/201/
簡単に言うと、アセットカタログには、属性インスペクターに「Preserve Vector Data」という新しいチェックボックスが含まれるようになりました。チェックすると、PDFデータがコンパイルされたバイナリに含まれ、そのサイズが大きくなります。しかし、iOSがベクターデータを両方向にスケーリングし、素敵な画像を提供する機会を与えてくれます(独自の困難を伴います)。 11より下のiOSの場合、回答で上に説明した古いスケーリングメカニズムが使用されます。
プロジェクト内の通常の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
}
}
}