2012-11-10 41 views
5

我的UIView的子類大量使用子圖層來構建複雜的圖像。屏幕上有多達30個這樣的視圖,並且在iPad 2上沿着perimeterPath(這是perimeterLayer的路徑屬性)的動畫表現受到了影響。將CALayer渲染爲圖像上下文正在返回黑色

最初,我只是將組成圖層作爲子圖層添加到我的視圖圖層上。

[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]]; 

既然這也給了我黑色的矩形,我已經總結出了在屏幕上獲得黑色矩形的任何方法都可以正常工作;-)但是我不知何故將頂層渲染成位圖圖形上下文。

我試過擺弄開始新上下文的選項部分,是vs NO,1.0 vs 0.0;一切都無濟於事。

什麼我在的過程中丟失:

  • 開始一個新的圖形上下文
  • 吸取我的層進入這方面
  • 從上下文

獲得圖像?

謝謝!

回答

9

那麼我發現我沒有做的事情:我的圖層從未繪製過它的內容,所以我需要發送setNeedsDisplay到圖層,然後試圖從圖像中獲取圖像(這對我來說似乎有點奇怪, drawLayer:inContext:and 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(); 
(代碼第一部分由託德Yandell計算器powever找到)