¿Cómo crear una imagen desde UILabel?

Actualmente estoy desarrollando un simple photoshop como aplicación en iphone. Cuando quiero aplanar mis capas, las tags están en la buena posición pero con un tamaño de fuente incorrecto. Aquí está mi código para aplanar:

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument)); for (UILabel *label in arrayLabel) { [label drawTextInRect:label.frame]; } UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

¿Alguien puede ayudarme?

Desde: tirando de un UIImage desde una UITextView o UILabel da una imagen blanca .

// 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; } 

// Swift extension w / usage. crédito @Heberti Almeida en los comentarios a continuación

 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) 

UILabel una extensión Swift para convertir 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 } } 

EDITAR: versión mejorada de Swift 4

 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) 

necesitas renderizar la etiqueta en un contexto

reemplazar

 [label drawTextInRect:label.frame]; 

con

 [label.layer renderInContext:UIGraphicsGetCurrentContext()]; 

y deberá crear una imagen por etiqueta, por lo tanto, mueva el ciclo for para que quede fuera de las llamadas al contexto de inicio y fin

para Swift, uso 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 } } } 

Puede usar renderInContext en cualquier 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 tags, al agregar las tags, puede agregarlas a un contenedorView. Y solo necesita hacer renderInContext en ese contenedorView.

    Intereting Posts