我的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;一切都無濟於事。
什麼我在的過程中丟失:
- 開始一個新的圖形上下文
- 吸取我的層進入這方面
- 從上下文
獲得圖像?
謝謝!