videos hacer fotos compartir como iphone objective-c uiimage uilabel flatten

compartir - como hacer un video de fotos en iphone



¿Cómo crear una imagen desde UILabel? (6)

Actualmente estoy desarrollando una aplicación similar a photoshop en iphone. Cuando quiero aplanar mis capas, las etiquetas están en la posición correcta 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 me puede ayudar?


De: extraer un UIImage de un UITextView o UILabel da una imagen en blanco .

// 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 / use. Crédito @Heberti Almeida en comentarios abajo

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)


He creado una extensión Swift para convertir la 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 Swift 4 mejorada

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 tendrá que crear una imagen por etiqueta, así que mueva el bucle for fuera de las llamadas de contexto inicial y final


Puedes usar renderInContext en cualquier CALayer. Dibujará la capa de su vista en el contexto. Para que puedas cambiarlo a una imagen. Además, si renderizaInContext en una vista, todas sus subvistas se dibujarán en el contexto. Entonces, en lugar de iterar a través de todas las etiquetas, mientras agrega las etiquetas, puede agregarlas a un containerView. Y solo hay que hacer renderInContext en ese containerView.


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


extension UIImage { class func imageFrom(text: String, width: CGFloat, font: UIFont, textAlignment: NSTextAlignment, lineBreakMode: NSLineBreakMode) -> UIImage? { let label = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude)) label.text = text label.font = font label.textAlignment = textAlignment label.lineBreakMode = lineBreakMode label.sizeToFit() UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0) label.layer.render(in: UIGraphicsGetCurrentContext()!) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img } }

Utilizando:

let iv = UIImageView(image: UIImage.imageFrom(text: "Test For /nYarik", width: 537.0, font: UIFont.systemFont(ofSize: 30), textAlignment: .center, lineBreakMode: .byWordWrapping)) iv.contentMode = .scaleAspectFit