Réponses:
Vous pouvez maintenant faire référence à votre image par son nom, comme vous le feriez pour n'importe quel fichier .png .
UIImage(named: "myImage")
La prise en charge des vecteurs est déroutante dans Xcode, car lorsque la plupart des gens pensent aux vecteurs, ils pensent à des images qui peuvent augmenter et diminuer tout en ayant une belle apparence. Cependant, Xcode 6 et 7 ne prennent pas entièrement en charge les vecteurs pour iOS, donc les choses fonctionnent un peu différemment.
Le système vectoriel est vraiment simple . Il prend votre .pdf
image et crée @1x.png
, @2x.png
et @3x.png
actifs au moment de la construction . (Vous pouvez utiliser un outil pour examiner le contenu de Assets.car pour vérifier cela.)
Par exemple, supposons que l'on vous donne foo.pdf
un élément vectoriel 44x44. Au moment de la construction, il générera les fichiers suivants:
foo@1x.png
à 44x44foo@2x.png
à 88x88foo@3x.png
à 132x132Cela fonctionne de la même manière pour n'importe quelle image de taille. Par exemple, si vous avez une valeur de bar.pdf
100x100, vous obtiendrez:
bar@1x.png
à 100x100bar@2x.png
à 200x200bar@3x.png
à 300x300resizableImageWithCapInsets:
et en divisant vos valeurs de tranche par[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)];
Ceci est un complément à l'excellente réponse de @Senseful.
Je vais vous dire comment faire cela dans Inkscape car il est gratuit et open source, mais les autres programmes devraient être similaires.
Dans Inkscape:
Remarques:
Si vous disposez déjà d'une image .svg dont la taille de page est incorrecte, procédez comme suit:
Pour convertir un fichier .svg en .pdf, vous pouvez également trouver des utilitaires en ligne pour faire le travail à votre place. Voici un exemple de cette réponse . Cela a l'avantage de vous permettre de définir facilement la taille .pdf.
Pour ceux qui ne sont toujours pas mis à jour, il y a eu des changements dans Xcode 9 (iOS 11).
Quoi de neuf dans Cocoa Touch (WWDC 2017 Session 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/
En quelques mots, le catalogue d'actifs inclut désormais la nouvelle case à cocher dans l'inspecteur d'attributs nommée «Préserver les données vectorielles». Lorsqu'elle est cochée, les données PDF seront incluses dans le binaire compilé, augmentant bien sûr sa taille. Mais cela donne une chance à iOS de mettre à l'échelle les données vectorielles dans les deux sens et de fournir de belles images (avec ses propres difficultés). Pour iOS inférieur à 11, les anciens mécanismes de mise à l'échelle décrits dans les réponses à la hausse sont utilisés.
Vous pouvez utiliser des fichiers PDF normaux dans votre projet sous forme d'images vectorielles et rendre des images de n'importe quelle taille à l'aide de cette extension. Cette méthode est bien meilleure car iOS ne générera pas d'images .PNG à partir de vos fichiers PDF, et vous pouvez rendre vos images avec la taille de votre choix:
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
}
}
}