2012-08-08 22 views
20

Ich entwickle gerade eine einfache Photoshop-Anwendung auf dem iPhone. Wenn ich meine Ebenen glätten möchte, sind die Etiketten an der richtigen Position, aber mit einer schlechten Schriftgröße. Hier ist mein Code zu glätten:Wie erstelle ich ein Bild von UILabel?

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument)); 

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

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

Wer kann mir helfen?

Antwort

38

Von: 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; 
} 

// Swift Erweiterung w/Nutzung. Kredit @Heberti Almeida in Kommentaren unten

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

Die Nutzung:

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

Ja, ich hatte diesen Beitrag gesehen, aber mit dieser Lösung kann ich nicht in High Definition-Datei bekommen. Aber du machst mich verständlich wo mein Problem ist! Vielen Dank !! – Jonathan

+6

@DJPlayer Um ein scharfes Bild für die Retina-Anzeige zu erhalten, müssen wir die erste Zeile in Ihrer Methode durch folgende Zeile ersetzen: 'UIGraphicsBeginImageContextWithOptions (self.bounds.size, self.opaque, 0.0);' wie in [dieser Frage] zu sehen (http://stackoverflow.com/q/4334233/2471006) und seine akzeptierte Antwort. Vielleicht möchten Sie Ihre Antwort einschließlich dieser Informationen aktualisieren. – anneblue

+0

@anneblue danke! – nemesis

5

Sie benötigen das Etikett in einem Kontext machen

ersetzen
[label drawTextInRect:label.frame]; 

mit

[label.layer renderInContext:UIGraphicsGetCurrentContext()]; 

und Sie müssen ein Bild pro Etikett erstellen, so dass die außerhalb der Beginn und das Ende Kontext für Schleife bewegen ruft

1

Sie renderInContext auf jedem CALayer verwenden können. Es wird die Ebene Ihrer Ansicht auf den Kontext zeichnen. Damit können Sie es zu einem Bild ändern. Wenn Sie in einer Ansicht renderContext ausführen, werden alle seine Untersichten auf den Kontext gezeichnet. Anstatt also alle Beschriftungen zu durchlaufen und die Beschriftungen hinzuzufügen, können Sie diese zu einem ContainerView hinzufügen. Und muss nur renderInContext auf diesem ContainerView tun.

12

Ich habe eine Swift-Erweiterung geschaffen, um die UILabel in eine UIImage zu machen:

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: Verbesserte Swift 4 Version

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

Die Verwendung ist einfach:

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

Du mein guter Herr bist wahrer Held! – rilar

+0

^^ Was er gesagt hat ^^ – bkwebhero

1

für Swift , Verwende ich diese UIView-Erweiterung:

Verwandte Themen