Comment le support vectoriel fonctionne-t-il dans Xcode 6?
Lorsque j'essaie de redimensionner une image, celle-ci semble irrégulière.
Vous pouvez maintenant faire référence à votre image par son nom, comme vous le feriez pour tout 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 être agrandies et réduites tout en restant belles. Cependant, Xcode 6 et 7 ne prennent pas en charge les vecteurs complets pour iOS, les choses fonctionnent donc un peu différemment.
Le système de vecteurs est très simple . Il prend votre image .pdf
et crée les actifs @1x.png
, @2x.png
et @3x.png
à au moment de la création . (Vous pouvez tilisez un outil pour examiner le contenu de Assets.car pour le vérifier.)
Par exemple, supposons que vous receviez foo.pdf
qui est un fichier vectoriel 44x44. Au moment de la construction , les fichiers suivants seront générés:
[email protected]
à 44x44[email protected]
à 88x88[email protected]
à 132x132Cela fonctionne de la même manière pour toute image de taille. Par exemple, si vous avez bar.pdf
qui est 100x100, vous obtiendrez:
[email protected]
à 100x100[email protected]
à 200x200[email protected]
à 300x300Ceci est un complément à l'excellente réponse de @Senseful.
Je vais vous dire comment faire cela dans Inkscape car il est gratuit et à code source ouvert, mais les autres programmes devraient être similaires.
Dans Inkscape:
Notes:
Si vous avez déjà une image .svg dont le format de page est incorrect, procédez comme suit:
Pour convertir un fichier .svg en un .pdf, vous pouvez également trouver des utilitaires en ligne qui effectuent le travail à votre place. Voici un exemple de cette réponse . Cela a l'avantage de vous permettre de définir facilement la taille du fichier .pdf.
Pour ceux qui ne sont toujours pas mis à jour, il y a eu des changements dans Xcode 9 (iOS 11).
Nouveautés de Cocoa Touch (WWDC 2017 Session 201) (@ 32: 55) https://developer.Apple.com/videos/play/wwdc2017/201/
En quelques mots, Asset Catalog inclut désormais la nouvelle case à cocher de l’Inspecteur des attributs intitulée "Conserver les données vectorielles". Lorsque cette case est cochée, les données PDF seront incluses dans le fichier binaire compilé, augmentant bien entendu sa taille. Mais cela donne à iOS une chance de redimensionner les données vectorielles dans les deux sens et de fournir des images de Nice (avec ses propres difficultés). Pour iOS inférieur à 11, les anciens mécanismes de mise à l'échelle décrits dans les réponses sont utilisés.
Vous pouvez utiliser des fichiers PDF normaux à l'intérieur de votre projet sous forme d'images vectorielles et restituer des images de toute 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. De plus, vous pouvez restituer vos images avec la taille que vous souhaitez:
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
}
}
}