답변:
이제 .png 파일 과 마찬가지로 이름으로 이미지를 참조 할 수 있습니다 .
UIImage(named: "myImage")
대부분의 사람들이 벡터를 생각할 때 확대 및 축소 할 수있는 이미지를 생각하기 때문에 Xcode에서는 벡터 지원이 혼동됩니다. 그러나 Xcode 6 및 7은 iOS를 완전히 지원하지 않으므로 약간 다르게 작동합니다.
벡터 시스템은 정말 간단 합니다. 그것은 당신의 소요 .pdf
이미지를, 그리고 생성 @1x.png
, @2x.png
및 @3x.png
에서 자산 빌드 시간 . (당신은 할 수 Assets.car의 내용을 검사하는 도구를 사용하여 이를 확인할 수 있습니다.)
예를 들어 foo.pdf
44x44 벡터 자산 인 것이 있다고 가정합니다 . 에서 빌드시 다음과 같은 파일을 생성합니다 :
foo@1x.png
44x44에서foo@2x.png
88x88에서foo@3x.png
132x132에서이것은 모든 크기의 이미지에서 동일하게 작동합니다. 예를 들어 bar.pdf
100x100 인 경우 다음과 같은 결과가 나타납니다.
bar@1x.png
100x100에서bar@2x.png
200x200에서bar@3x.png
300x300에서resizableImageWithCapInsets:
하고 다음과 같이 나누어 코드에서 직접 할 수 있습니다.[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/
간단히 말해 Asset Catalog에는 속성 벡터에 "벡터 데이터 유지"라는 새로운 확인란이 포함됩니다. 이 옵션을 선택하면 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
}
}
}