2012-08-08 11 views
20

Actualmente estoy desarrollando un simple photoshop como aplicación en iphone. Cuando quiero aplanar mis capas, las etiquetas están en la buena posición pero con un tamaño de fuente incorrecto. Aquí está mi código para aplanar:¿Cómo crear una imagen desde UILabel?

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument)); 

for (UILabel *label in arrayLabel) { 
    [label drawTextInRect:label.frame]; 
} 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Alguien me puede ayudar?

Respuesta

38

De: pulling an UIImage from a UITextView or UILabel gives white image.

// iOS

- (UIImage *)grabImage { 
    // Create a "canvas" (image context) to draw in. 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0); // high res 
    // Make the CALayer to draw in our "canvas". 
    [[self layer] renderInContext: UIGraphicsGetCurrentContext()]; 

    // Fetch an UIImage of our "canvas". 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    // Stop the "canvas" from accepting any input. 
    UIGraphicsEndImageContext(); 

    // Return the image. 
    return image; 
} 

// extensión Swift w/uso. crédito @Heberti Almeida por debajo comenta

extension UIImage { 
    class func imageWithLabel(label: UILabel) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0) 
     label.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     let img = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return img 
    } 
} 

El uso:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22)) 
label.text = bulletString 
let image = UIImage.imageWithLabel(label) 
+0

Sí, había visto esta publicación pero con esta solución no puedo obtener un archivo de alta definición. ¡Pero me haces entender dónde está mi problema! ¡Muchas gracias! – Jonathan

+6

@DJPlayer Para obtener una imagen nítida para la visualización de la retina, necesitamos reemplazar la primera línea de su método por esta línea: 'UIGraphicsBeginImageContextWithOptions (self.bounds.size, self.opaque, 0.0);' como se ve en [esta pregunta] (http://stackoverflow.com/q/4334233/2471006) y su respuesta aceptada. Quizás desee actualizar su respuesta, incluida esa información. – anneblue

+0

@anneblue gracias! – nemesis

5

se necesitan para representar la etiqueta en un contexto

reemplazar

[label drawTextInRect:label.frame]; 

con

[label.layer renderInContext:UIGraphicsGetCurrentContext()]; 

y usted tendrá que crear una imagen por etiqueta, por lo que mover el bucle for para fuera del contexto comenzar y finalizar las llamadas

1

Usted puede utilizar en cualquier renderInContext CALayer. Dibujará la capa de su vista en el contexto. Para que pueda cambiarlo a una imagen. Además, si hace renderInContext en una vista, todas sus subvistas se dibujarán en el contexto. Entonces, en lugar de iterar a través de todas las etiquetas, al agregar las etiquetas, puede agregarlas a un contenedorView. Y solo necesita hacer renderInContext en ese contenedorView.

12

He creado una extensión Swift para hacer que el UILabel en un UIImage:

extension UIImage { 
    class func imageWithLabel(label: UILabel) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0) 
     label.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     let img = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return img 
    } 
} 

EDIT: Mejora Swift 4 Versión

extension UIImage { 
    class func imageWithLabel(_ label: UILabel) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0) 
     defer { UIGraphicsEndImageContext() } 
     label.layer.render(in: UIGraphicsGetCurrentContext()!) 
     return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage() 
    } 
} 

El uso es simple:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22)) 
label.text = bulletString 
let image = UIImage.imageWithLabel(label) 
+1

¡Mi buen señor es el verdadero héroe! – rilar

+0

^^ Lo que dijo ^^ – bkwebhero

1

para Swift , Utilizo esta extensión UIView:

// Updated for Swift 3.0 
extension UIView { 
    var grabbedImage:UIImage? { 
     get { 
      UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0) 
      layer.render(in: UIGraphicsGetCurrentContext()!) 
      let img = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 
      return img 
     } 
    } 
} 
Cuestiones relacionadas