2010-02-05 12 views
25

पर टेक्स्ट जोड़ें UILabel को CALayer पर उपclassing और drawInContext: में ड्राइंग के बिना जोड़ना संभव है?CALayer

धन्यवाद!

उत्तर

37

मुझे नहीं लगता कि आप एक CALayer ऑब्जेक्ट में UIView सबक्लास जोड़ सकते हैं। हालांकि यदि आप एक कैलियर ऑब्जेक्ट पर टेक्स्ट खींचना चाहते हैं, तो यह नीचे दिखाए गए अनुसार एनएसएसटींग UIKit additions में दिए गए ड्राइंग फ़ंक्शंस का उपयोग करके किया जा सकता है। जबकि मेरा कोड प्रतिनिधि के ड्रॉलेयर में किया जाता है: इनकॉन्टेक्स्ट विधि, इसका उप-वर्ग 'drawInContext: विधि में उपयोग किया जा सकता है। क्या कोई विशिष्ट UILabel कार्यक्षमता है जिसे आप लाभ उठाना चाहते हैं?

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    CGContextSetFillColorWithColor(ctx, [[UIColor darkTextColor] CGColor]); 

    UIGraphicsPushContext(ctx); 
    /*[word drawInRect:layer.bounds 
      withFont:[UIFont systemFontOfSize:32] 
    lineBreakMode:UILineBreakModeWordWrap 
     alignment:UITextAlignmentCenter];*/ 

    [word drawAtPoint:CGPointMake(30.0f, 30.0f) 
      forWidth:200.0f 
      withFont:[UIFont boldSystemFontOfSize:32] 
     lineBreakMode:UILineBreakModeClip]; 

    UIGraphicsPopContext(); 
} 
+0

[[UIColor darkTextColor] सेट] जब ग्राफिक्स संदर्भ – rpetrich

+0

पुश किए गए भी काम करता है @ दीपक डंडुप्रोलू यह मेरे लिए काम करता है, लेकिन मुझे लगता है कि इसे – zeroleaf

4

आपका UILabel पहले से ही इसके पीछे एक CALayer है। यदि आप कई कैलियर एकत्र कर रहे हैं, तो आप उनमें से किसी एक के उपन्यास के रूप में UILabel की परत को जोड़ सकते हैं (इसकी layer संपत्ति का उपयोग करके)।

यदि यह एक परत में प्रत्यक्ष टेक्स्ट ड्राइंग है जो आप चाहते हैं, तो यूपीकिट एनएसएसटींग जोड़ जो दीपक को इंगित करने का तरीका है। कार्रवाई में इस उदाहरण के लिए, Core Plot framework में एक मैक/आईफोन प्लेटफॉर्म-स्वतंत्र कैलियर सबक्लास है जो पाठ प्रतिपादन करता है, CPTextLayer

+0

हे ब्रैड क्यों काम करने के लिए पुश और पॉप फ़ंक्शन को कॉल करना चाहिए, मैं वास्तव में इस तकनीक का उपयोग करने के लिए उपयोग करता था, (एक यूलाबेल की परत को कैलियर में जोड़ना) और ऐसा लगता है कि शायद यह काम करना बंद कर दिया गया है आईओएस 8 बेस एसडीके में? मैंने एक पुराना ऐप पुनर्निर्माण शुरू कर दिया है जो मैंने वीडियो निर्यात किया है, और माता-पिता कैलियर के उपन्यास इस पुराने कोड के साथ शून्य रहना प्रतीत होता है। कुछ और गलत हो सकता है, देखने के लिए जा रहा है। –

+0

इसे फिक्स्ड। आईओएस 8 बेस एसडीके के खिलाफ इस काम को संकलित करने के तरीके के साथ आने वाले किसी और के लिए, लेबल की परत को दूसरे कैलियर में जोड़ने से पहले [label.layer डिस्प्ले] पर कॉल करें। क्रेडिट: http://stackoverflow.com/questions/23171790/is-it-safe-to-add-a-stolen-uilabels-layer-to-some-other-calayers-sublayer –

2

एक CATextLayer को एक उपन्यास के रूप में जोड़ें और स्ट्रिंग गुण सेट करें। यह सबसे आसान होगा और आप इसे बहुत सामान्य बनाने के लिए आसानी से एक लेआउट प्रबंधक का उपयोग कर सकते हैं।

+2

... आसानी से लेआउट का उपयोग कर सकते हैं प्रबंधक _... ठीक है, मैकोज़ में, हाँ, लेकिन आईओएस में नहीं। आईओएस में कैलियर लेआउट प्रबंधकों का समर्थन नहीं करते हैं: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layout.html – Dalbergia

+0

उसे नहीं पता था! धन्यवाद दोस्त। –

135
 CATextLayer *label = [[CATextLayer alloc] init]; 
     [label setFont:@"Helvetica-Bold"]; 
     [label setFontSize:20]; 
     [label setFrame:validFrame]; 
     [label setString:@"Hello"]; 
     [label setAlignmentMode:kCAAlignmentCenter]; 
     [label setForegroundColor:[[UIColor whiteColor] CGColor]]; 
     [layer addSublayer:label]; 

     [label release]; 
+3

आईएमएचओ, जब तक आपको मूल टेक्स्ट ड्राइंग से अधिक की आवश्यकता नहीं है, तब तक यह कस्टम कैलियर या परत प्रतिनिधि से एक आसान समाधान है। CATextLayer पहले से ही जानता है कि पाठ कैसे आकर्षित करें, इसलिए पहिया को फिर से शुरू करने की कोई आवश्यकता नहीं है। – Dalbergia

+0

@ Mshah2 पाठ गैर-एंटीअलाइजिंग प्रभाव के साथ क्यों आ रहा है? पाठ की तरह यह – sreekanthk

+16

बढ़ाई गई है, आपको कैलियर के सामग्री पैमाने को समायोजित करने की आवश्यकता है अन्यथा आपको रेटिना (@ 2x) या @ 3x डिवाइस पर एक धुंधला पाठ मिलेगा। उपयोग करें: label.contentsScale = [यूआईस्क्रीन मुख्य स्क्रीन]। स्केल; – yonel

-1

हमेशा की तरह, पिछले sublayers दूर करने के लिए यदि आप वाला, एक और एक जोड़ने के डुप्लिकेट विचारों को रोकने के लिए याद रखें:

if let sublayers = layer.sublayers { 
    for sublayer in sublayers { 
     sublayer.removeFromSuperlayer() 
    } 
} 
संबंधित मुद्दे