4

角が丸くドロップシャドウのあるUIViewがあり、実装されて機能しています。しかし、UIViewの背景色は退屈な白です。そこで、背景にグラデーションレイヤーを配置したいと思います。ラベル、ボタン、そして最も重要なものの下に、丸みを帯びた角がまだ表示されるようにします。

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = subHudView.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
[subHudView.layer addSublayer:gradient];
subHudView.layer.cornerRadius = 8;
subHudView.layer.masksToBounds = NO;
subHudView.layer.shadowOffset = CGSizeMake(-5, 5);
subHudView.layer.shadowRadius = 8;
subHudView.layer.shadowOpacity = 0.75;

これは私が実装しようとした私のコードですが、グラデーションレイヤーはビュー内のすべてのものの上にあります。グラデーションをすべてのコントロールとラベルの下に配置するにはどうすればよいですか?すべての応答の助けは高く評価されます。

4

5 に答える 5

2

ビューに追加されたレイヤー ( addSublayer) は、ビューのすべての描画が行われる、ビュー自体のレイヤーの前に描画されます。必要なのは、グラデーションをビューの独自のレイヤーに描画することです。これを行うには、ビューのレイヤーをグラデーション ビューにすること+layerClassを指定して、ビューに実装します。

たとえば、(ビュー自体のコードで):

+(Class)layerClass {
    return [CAGradientLayer class];
}

-(void)awakeFromNib {
    [super awakeFromNib];
    CAGradientLayer* layer = (CAGradientLayer*)self.layer;
    layer.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
    layer.cornerRadius = 8;
    layer.masksToBounds = NO;
    layer.shadowOffset = CGSizeMake(-5, 5);
    layer.shadowRadius = 8;
    layer.shadowOpacity = 0.75;
}

ただし、次に drawRect: を実装すると、もちろん、グラデーションと丸みを帯びた角が消去されます。それを回避する方法はあります...

于 2011-11-25T19:06:14.403 に答える
1

addSublayer:すべてのサブレイヤーの一番上にレイヤーを追加すると。

おそらく代わりにそのようなものを使用する必要があります:

[subHudView.layer insertSublayer:gradient atIndex:0];

そうCAGradientLayerすれば、他のすべての下になります。

于 2011-11-25T19:01:44.307 に答える
0

gcamp が提案した insertSublayer:atIndex: だけでなく、insertSublayer:above: と insertSublayer:below: を使用して、レイヤーを特定の場所に配置することもできます。

[self.view.layer insertSublayer:gradient below:someUIObject];
于 2011-11-25T19:06:50.070 に答える
0

新しいレイヤーを作成するのではなく、ビューのレイヤー メソッドをオーバーライドします。

+ (Class)layerClass
{
    return [CAGradientLayer class];
}

これにより、ビューが基本的な CALayer ではなく CAGradientLayer をベース レイヤーとして作成することが保証されます。

次に、初期化中にレイヤーを取得します。

CAGradientLayer *gradLayer = self.layer;
gradLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];

それにグラデーションを割り当てます。

素敵できれい...

于 2011-11-25T19:57:46.537 に答える