Respuestas:
Ahora puede referirse a su imagen por su nombre, tal como lo haría con cualquier archivo .png .
UIImage(named: "myImage")
El soporte de vectores es confuso en Xcode, porque cuando la mayoría de las personas piensan en vectores, piensan en imágenes que pueden escalar hacia arriba y hacia abajo y aún lucir bien. Sin embargo, Xcode 6 y 7 no tienen soporte completo de vectores para iOS, por lo que las cosas funcionan de manera un poco diferente.
El sistema vectorial es realmente simple . Toma su .pdf
imagen, y crea @1x.png
, @2x.png
y @3x.png
activos en el tiempo de construcción . (Puede usar una herramienta para examinar el contenido de Assets.car para verificar esto).
Por ejemplo, suponga foo.pdf
que tiene un activo vectorial de 44x44. En el momento de la compilación generará los siguientes archivos:
foo@1x.png
a 44x44foo@2x.png
a 88x88foo@3x.png
a 132x132Esto funciona igual para cualquier imagen de tamaño. Por ejemplo, si tiene bar.pdf
cuál es 100x100, obtendrá:
bar@1x.png
a 100x100bar@2x.png
a 200x200bar@3x.png
a 300x300resizableImageWithCapInsets:
y dividiendo sus valores de corte 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 es un complemento de la excelente respuesta de @Senseful.
Diré cómo hacer esto en Inkscape, ya que es gratuito y de código abierto, pero otros programas deberían ser similares.
En Inkscape:
Notas:
Si ya tiene una imagen .svg que tiene el tamaño de página incorrecto, haga lo siguiente:
Para convertir un archivo .svg en un .pdf, también puede encontrar utilidades en línea para hacer el trabajo por usted. Aquí hay un ejemplo de esta respuesta . Esto tiene el beneficio de permitirle configurar el tamaño .pdf fácilmente.
Para aquellos que aún no se actualizaron, hubo cambios en Xcode 9 (iOS 11).
Novedades de Cocoa Touch (WWDC 2017 Sesión 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/
En pocas palabras, el Catálogo de activos ahora incluye la nueva casilla de verificación en el Inspector de atributos llamada "Preservar datos vectoriales". Cuando se marca, los datos PDF se incluirán en el binario compilado, lo que aumenta su tamaño, por supuesto. Pero le da la oportunidad a iOS de escalar los datos vectoriales en ambas direcciones y proporcionar buenas imágenes (con sus propias dificultades). Para iOS por debajo de 11, se utilizan los antiguos mecanismos de escala descritos en las respuestas hacia arriba.
Puede usar archivos PDF normales dentro de su proyecto como imágenes vectoriales y renderizar imágenes de cualquier tamaño con esta extensión. De esta manera, es mucho mejor porque iOS no generará imágenes .PNG de sus archivos PDF, además puede renderizar imágenes con el tamaño que desee:
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
}
}
}