2012-11-10 37 views
5

UIView का मेरा सबक्लास एक जटिल छवि बनाने के लिए sublayers का व्यापक उपयोग करता है। स्क्रीन पर और आईपैड 2 पर इनमें से 30 विचार हैं, परिधिपैथ (जो परिधि लेयर का पथ विशेषता है) के साथ एनिमेशन का प्रदर्शन पीड़ित था।एक छवि संदर्भ में एक कैलियर प्रस्तुत करना कालाता लौटा रहा है

मूल रूप से, मैं सिर्फ अपने दृश्य की परत पर घटक परतों को सब्लेयर के रूप में जोड़ रहा था।

[self.layer addSublayer:self.leftsideLayer]; // CAShapeLayer 
[self.layer addSublayer:self.rightsideLayer]; // CAShapeLayer 
[self.layer addSublayer:self.perimeterLayer]; // CAShapelayer 
[self.layer addSublayer:self.valueLayer];  // CAShapeLayer 
[self.layer insertSublayer:self.gradientLayer atIndex:0]; // CAGradientLayer + CAShapeLayer (as mask) 

ऑन-स्क्रीन रेंडर सही है। लेकिन चूंकि एनिमेशन अंतराल शुरू हो रहे थे, इसलिए मैंने अस्थायी परत को बिटमैप में प्रस्तुत करने के इरादे से एक अस्थायी परत के निर्माण के लिए इस कोड को प्रीपेड किया था। चरण एक यह सुनिश्चित करने के लिए था कि मैं मौजूदा कोड को थोड़ा सा पुन: कार्य कर सकता हूं:

CALayer *tmpLayer = [CALayer layer]; 
[tmpLayer addSublayer:self.leftsideLayer]; // CAShapeLayer 
[tmpLayer addSublayer:self.rightsideLayer]; // CAShapeLayer 
[tmpLayer addSublayer:self.perimeterLayer]; // CAShapelayer 
[tmpLayer addSublayer:self.valueLayer];  // CAShapeLayer 
[tmpLayer insertSublayer:self.gradientLayer atIndex:0]; // CAGradientLayer + CAShapeLayer (as mask) 
[self.layer addSublayer:tmpLayer]; 

जैसा कि अपेक्षित था, ठीक काम किया।

अगले कदम तो इन सभी परतों के एक पूर्व गाया संस्करण उत्पन्न करने के लिए होगा:

// [self.layer addSublayer:tmpLayer]; 
    UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [self drawLayer:tmpLayer inContext:ctx]; 
    UIImage *renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext(); 
    if (!renderedImageOfMyself) { 
     NSLog(@"Well that didn't work"); 
    } 
    UIGraphicsEndImageContext(); 
    [self.layer setContents:renderedImageOfMyself.CGImage]; 

इस बात का परिणाम स्क्रीन पर काले आयतों था, तो अगले मैंने कोशिश की:

// [self.layer setContents:renderedImageOfMyself.CGImage]; 
[self addSubview:[[UIImageView alloc] initWithImage:renderedImageOfMyself]]; 

चूंकि यह मुझे काले आयताकार भी दे रहा है, मैंने निष्कर्ष निकाला है कि स्क्रीन पर काले आयत प्राप्त करने की विधि ठीक काम करती है ;-) लेकिन मैंने किसी भी तरह से बिटमैप ग्राफिक्स संदर्भ में प्रस्तुत करने के लिए शीर्ष परत को गड़बड़ कर लिया है।

मैंने नए संदर्भ, हाँ बनाम NO, 1.0 बनाम 0.0 शुरू करने के विकल्प भाग के साथ झुकाव करने की कोशिश की है; सब कुछ फायदा नहीं हुआ।

क्या मैं करने की प्रक्रिया में याद आ रही है:

  • एक नया ग्राफिक्स संदर्भ
  • इस संदर्भ
  • में मेरी परत आकर्षित शुरू इस संदर्भ

से छवि प्राप्त?

धन्यवाद!

उत्तर

9

अच्छी तरह से मैंने पाया कि मैं क्या नहीं कर रहा था: मेरी परत ने कभी भी इसकी सामग्री नहीं खींची थी, इसलिए मुझे छवि से प्राप्त करने की कोशिश करने से पहले परत में सेटडिड्स डिस्प्ले भेजने की आवश्यकता थी (जो मुझे विधि नामों के साथ थोड़ा अजीब लगता है drawLayer: InContext: और renderInContext:)

[tmpLayer setNeedsDisplay]; 
UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
[tmpLayer renderInContext:ctx]; 
renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
[self.layer setContents:renderedImageOfMyself.CGImage]; 
2

अच्छा काम है लेकिन कभी कभी iOS 6 पर अजीब संकेत दिए गए कार्यों के लिए काम नहीं करता।

मुझे आशा है कि भविष्य :) में इस मदद किसी

UIGraphicsBeginImageContextWithOptions([tmpLayer frame].size, YES, 0.0); 
[tmpLayer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
(कोड के भाग I टोड Yandell द्वारा stackoverflow हटा समर्थन को मिला था)