36

CAShapeLayerにグラデーションを適用した経験はありますか?CAShapeLayerは素晴らしいレイヤークラスですが、塗りつぶしの塗りつぶしのみをサポートしているように見えますが、グラデーション塗りつぶし(実際にはアニメート可能なグラデーション)が必要です。

CAShapeLayerに関係する他のすべて(シャドウ、シェイプ、ストロークカラー、アニメート可能なシェイプパス)は素晴らしいです。

CAShapeLayer内にCAGradientLayerを配置するか、実際にCAShapeLayerをGradientLayerのマスクとして設定し、両方をコンテナーレイヤーに追加しようとしましたが、これらは正しい結果をもたらしません。

CAShapeLayerをサブクラス化する必要がありますか、それとももっと良い方法がありますか?

ありがとう。

4

3 に答える 3

64

次のように、シェイプのパスを使用してマスキング レイヤーを作成し、それをグラデーション レイヤーに適用できます。

UIView *v = [[UIView alloc] initWithFrame:self.window.frame];

CAShapeLayer *gradientMask = [CAShapeLayer layer];   
gradientMask.fillColor = [[UIColor clearColor] CGColor];
gradientMask.strokeColor = [[UIColor blackColor] CGColor];
gradientMask.lineWidth = 4;
gradientMask.frame = CGRectMake(0, 0, v.bounds.size.width, v.bounds.size.height);

CGMutablePathRef t = CGPathCreateMutable();    
CGPathMoveToPoint(t, NULL, 0, 0);
CGPathAddLineToPoint(t, NULL, v.bounds.size.width, v.bounds.size.height);

gradientMask.path = t;


CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.startPoint = CGPointMake(0.5,1.0);
gradientLayer.endPoint = CGPointMake(0.5,0.0);
gradientLayer.frame = CGRectMake(0, 0, v.bounds.size.width, v.bounds.size.height);
NSMutableArray *colors = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
    [colors addObject:(id)[[UIColor colorWithHue:(0.1 * i) saturation:1 brightness:.8 alpha:1] CGColor]];
}
gradientLayer.colors = colors;

[gradientLayer setMask:gradientMask];
[v.layer addSublayer:gradientLayer];

影も使用する場合は、グラデーション レイヤーの下にシェイプ レイヤーの「複製」を配置して、同じパス参照を再利用する必要があります。

于 2011-08-31T23:52:00.180 に答える