2012-08-08 33 views
20

मैं वर्तमान में आईफोन पर एप्लिकेशन की तरह एक साधारण फ़ोटोशॉप विकसित कर रहा हूं। जब मैं अपनी परतों को फ़्लैट करना चाहता हूं, तो लेबल अच्छी स्थिति में हैं लेकिन खराब फ़ॉन्ट आकार के साथ। यहाँ मेरी कोड समतल है:UILabel से एक छवि कैसे बनाएं?

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument)); 

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

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

किसी मेरी मदद कर सकते?

उत्तर

38

से: pulling an UIImage from a UITextView or UILabel gives white image

// आईओएस

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

// स्विफ्ट विस्तार w/उपयोग। नीचे में क्रेडिट @Heberti अल्मीडा टिप्पणी

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

उपयोग:

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

हाँ, मैंने यह पोस्ट देखा था लेकिन इस समाधान के साथ मुझे उच्च परिभाषा फ़ाइल नहीं मिल सकती है। लेकिन आप मुझे समझते हैं कि मेरी समस्या कहां है! बहुत बहुत धन्यवाद !! – Jonathan

+6

@ डीजेप्लेयर रेटिना डिस्प्ले के लिए एक तेज छवि प्राप्त करने के लिए, हमें इस विधि से अपनी विधि में पहली पंक्ति को प्रतिस्थापित करने की आवश्यकता है: 'UIGraphicsBeginImageContextWithOptions (self.bounds.size, self.opaque, 0.0); जैसा कि [इस प्रश्न में देखा गया है] (http://stackoverflow.com/q/4334233/2471006) और इसके स्वीकृत उत्तर। शायद आप उस जानकारी सहित अपना उत्तर अपडेट करना चाहेंगे। – anneblue

+0

@anneblue धन्यवाद! – nemesis

5

आप एक संदर्भ में लेबल रेंडर करने के लिए की जरूरत है

[label drawTextInRect:label.frame]; 

की जगह

[label.layer renderInContext:UIGraphicsGetCurrentContext()]; 
साथ

और आप लेबल के अंतर्गत अधिकतम एक छवि बनाने की जरूरत है, तो शुरू और समाप्त संदर्भ से बाहर करने के लिए पाश के लिए चले जाएँगे कॉल

1

आप किसी भी CALayer पर renderInContext उपयोग कर सकते हैं। यह संदर्भ पर आपकी दृश्य की परत खींच जाएगा। ताकि आप इसे एक छवि में बदल सकें। इसके अलावा यदि आप एक दृश्य पर renderInContext करते हैं, तो इसके सभी सबव्यूफ संदर्भ पर खींचे जाएंगे। तो लेबल जोड़ने के दौरान, सभी लेबलों के माध्यम से पुनरावृत्त करने के बजाय, आप उन्हें कंटेनर व्यू में जोड़ सकते हैं। और बस उस कंटेनर व्यू पर renderInContext करने की आवश्यकता है।

12

मैं एक स्विफ्ट विस्तार बनाया है UIImage एक में UILabel रेंडर करने के लिए:

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

संपादित करें: बेहतर स्विफ्ट 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() 
    } 
} 

उपयोग सरल है:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22)) 
label.text = bulletString 
let image = UIImage.imageWithLabel(label) 
स्विफ्ट के लिए
+1

में' NO' के लिए पारदर्शी छवि सेट अपारदर्शी की आवश्यकता है तो आप मेरे अच्छे सर असली नायक हैं! – rilar

+0

^^ उसने क्या कहा ^^ – bkwebhero

1

, मैं इस 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 
     } 
    } 
}