Antworten:
Sie können jetzt wie bei jeder PNG- Datei anhand des Namens auf Ihr Bild verweisen .
UIImage(named: "myImage")
Die Vektorunterstützung ist in Xcode verwirrend, denn wenn die meisten Menschen an Vektoren denken, denken sie an Bilder, die sich vergrößern und verkleinern lassen und trotzdem gut aussehen. Xcode 6 und 7 bieten jedoch keine vollständige Vektorunterstützung für iOS, sodass die Dinge etwas anders funktionieren.
Das Vektorsystem ist wirklich einfach . Es braucht Ihr .pdf
Bild, und schafft @1x.png
, @2x.png
und @3x.png
Vermögenswerte zum Erstellungszeitpunkt . (Sie können ein Tool verwenden, um den Inhalt von Assets.car zu überprüfen und dies zu überprüfen.)
foo.pdf
Angenommen , Sie erhalten ein 44x44-Vektor-Asset. Beim Erstellen werden die folgenden Dateien generiert:
foo@1x.png
bei 44x44foo@2x.png
bei 88x88foo@3x.png
bei 132x132Dies funktioniert für Bilder jeder Größe gleich. Wenn Sie beispielsweise bar.pdf
eine Größe von 100 x 100 haben, erhalten Sie:
bar@1x.png
bei 100x100bar@2x.png
bei 200x200bar@3x.png
bei 300x300resizableImageWithCapInsets:
indem Sie Ihre Slice-Werte verwenden und durch[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)];
Dies ist eine Ergänzung zu der hervorragenden Antwort von @Senseful.
Ich werde erklären, wie dies in Inkscape gemacht wird, da es kostenlos und Open Source ist, aber andere Programme sollten ähnlich sein.
In Inkscape:
Anmerkungen:
Wenn Sie bereits ein .svg-Bild mit der falschen Seitengröße haben, gehen Sie wie folgt vor:
Um eine .svg-Datei in eine .pdf-Datei zu konvertieren, finden Sie auch Online-Dienstprogramme, die die Arbeit für Sie erledigen. Hier ist ein Beispiel aus dieser Antwort . Dies hat den Vorteil, dass Sie die PDF-Größe einfach einstellen können.
Für diejenigen, die noch nicht aktualisiert wurden, gab es Änderungen in Xcode 9 (iOS 11).
Was ist neu in Cocoa Touch (WWDC 2017 Session 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/
Mit wenigen Worten, der Asset-Katalog enthält jetzt das neue Kontrollkästchen im Attributinspektor mit dem Namen "Vektordaten beibehalten". Wenn diese Option aktiviert ist, werden PDF-Daten in die kompilierte Binärdatei aufgenommen, wodurch sich die Größe natürlich erhöht. Für iOS besteht jedoch die Möglichkeit, die Vektordaten in beide Richtungen zu skalieren und schöne Bilder bereitzustellen (mit eigenen Schwierigkeiten). Für iOS unter 11 werden alte Skalierungsmechanismen verwendet, die in den Antworten nach oben beschrieben sind.
Mit dieser Erweiterung können Sie normale PDF-Dateien in Ihrem Projekt als Vektorbilder verwenden und Bilder jeder Größe rendern. Dieser Weg ist viel besser, da iOS keine PNG-Bilder aus Ihren PDF-Dateien generiert. Außerdem können Sie Bilder mit jeder gewünschten Größe rendern:
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
}
}
}