Respostas:
Agora você pode se referir à sua imagem pelo nome, assim como faria com qualquer arquivo .png .
UIImage(named: "myImage")
O suporte a vetores é confuso no Xcode, porque quando a maioria das pessoas pensa em vetores, elas pensam em imagens que podem aumentar e diminuir a escala e ainda parecerem boas. No entanto, o Xcode 6 e 7 não tem suporte completo para vetores para iOS, portanto, as coisas funcionam de maneira um pouco diferente.
O sistema vetorial é realmente simples . Leva a sua .pdf
imagem, e cria @1x.png
, @2x.png
e @3x.png
ativos em tempo de compilação . (Você pode usar uma ferramenta para examinar o conteúdo de Assets.car para verificar isso.)
Por exemplo, suponha que você receba foo.pdf
um ativo vetorial de 44x44. No momento da construção, ele gera os seguintes arquivos:
foo@1x.png
em 44x44foo@2x.png
em 88x88foo@3x.png
em 132x132Isso funciona da mesma forma para qualquer imagem de tamanho. Por exemplo, se você possui bar.pdf
100 x 100, receberá:
bar@1x.png
em 100x100bar@2x.png
em 200x200bar@3x.png
em 300 x 300resizableImageWithCapInsets:
e dividindo seus valores fatia por[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)];
Este é um complemento à excelente resposta de @Senseful.
Vou dizer como fazer isso no Inkscape, pois é gratuito e de código aberto, mas outros programas devem ser semelhantes.
No Inkscape:
Notas:
Se você já possui uma imagem .svg com o tamanho de página errado, faça o seguinte:
Para converter um arquivo .svg em um .pdf, você também pode encontrar utilitários online para fazer o trabalho por você. Aqui está um exemplo de esta resposta . Isso tem o benefício de permitir que você defina o tamanho .pdf facilmente.
Para quem ainda não atualizou, houve alterações no Xcode 9 (iOS 11).
O que há de novo no Cocoa Touch (WWDC 2017 Session 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/
Em poucas palavras, o Catálogo de ativos agora inclui a nova caixa de seleção no Inspetor de atributos denominada "Preservar dados vetoriais". Quando marcado, os dados em PDF serão incluídos no binário compilado, aumentando seu tamanho, é claro. Mas isso permite ao iOS dimensionar os dados vetoriais em ambas as direções e fornecer imagens agradáveis (com suas próprias dificuldades). Para iOS abaixo de 11, os mecanismos de escala antigos descritos nas respostas para cima são usados.
Você pode usar arquivos PDF normais dentro do seu projeto como imagens vetoriais e renderizar imagens de qualquer tamanho usando esta extensão. Dessa maneira, é muito melhor porque o iOS não gera imagens .PNG a partir de seus arquivos PDF, além de você poder renderizá-las com o tamanho que desejar:
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
}
}
}