回答:
これで、他の.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セッション201)(@ 32:55) https://developer.apple.com/videos/play/wwdc2017/201/
簡単に言うと、アセットカタログの属性インスペクターに「ベクターデータを保持」という新しいチェックボックスが追加されました。オンにすると、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
}
}
}