Risposte:
Ora puoi fare riferimento alla tua immagine con il suo nome, proprio come faresti con qualsiasi file .png .
UIImage(named: "myImage")
Il supporto vettoriale è confuso in Xcode, perché quando la maggior parte delle persone pensa ai vettori, pensa alle immagini che possono ridimensionarsi su e giù e comunque avere un bell'aspetto. Tuttavia, Xcode 6 e 7 non hanno il supporto vettoriale completo per iOS, quindi le cose funzionano in modo leggermente diverso.
Il sistema vettoriale è davvero semplice . Prende la tua .pdf
immagine, e crea @1x.png
, @2x.png
e @3x.png
le attività in fase di compilazione . (È possibile utilizzare uno strumento per esaminare il contenuto di Assets.car per verificarlo.)
Ad esempio, supponiamo che ti venga dato foo.pdf
che è un asset vettoriale 44x44. Al momento della generazione genererà i seguenti file:
foo@1x.png
a 44x44foo@2x.png
a 88x88foo@3x.png
a 132x132Questo funziona allo stesso modo per qualsiasi immagine di dimensioni. Ad esempio, se hai bar.pdf
100x100, otterrai:
bar@1x.png
a 100x100bar@2x.png
a 200x200bar@3x.png
a 300x300resizableImageWithCapInsets:
e dividendo i valori della sezione per[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)];
Questo è un supplemento alla risposta eccellente di @Senseful.
Dirò come farlo in Inkscape poiché è gratuito e open source ma altri programmi dovrebbero essere simili.
In Inkscape:
Appunti:
Se hai già un'immagine .svg della dimensione della pagina sbagliata, procedi come segue:
Per convertire un file .svg in un .pdf puoi anche trovare utility online per fare il lavoro per te. Ecco un esempio da questa risposta . Questo ha il vantaggio di permetterti di impostare facilmente la dimensione .pdf.
Per coloro che non hanno ancora effettuato l'aggiornamento, sono state apportate modifiche in Xcode 9 (iOS 11).
Novità di Cocoa Touch (WWDC 2017 Session 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/
In poche parole, il Catalogo risorse ora include la nuova casella di controllo in Impostazioni attributi denominata "Conserva dati vettoriali". Se selezionato, i dati PDF verranno inclusi nel file binario compilato, aumentandone ovviamente le dimensioni. Ma offre a iOS la possibilità di ridimensionare i dati vettoriali in entrambe le direzioni e fornire belle immagini (con le sue difficoltà). Per iOS inferiore a 11, vengono utilizzati i vecchi meccanismi di ridimensionamento descritti nelle risposte verso l'alto.
Puoi usare normali file PDF all'interno del tuo progetto come immagini vettoriali e renderizzare immagini di qualsiasi dimensione usando questa estensione. In questo modo è meglio perché iOS non genererà immagini .PNG dai tuoi file PDF, inoltre puoi renderizzare le immagini con qualsiasi dimensione tu voglia:
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
}
}
}