1

次のコードを使用して、imageViewレイヤーに影を追加できます。

self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"]];
self.imageView.center = self.view.center;
CALayer *containerLayer= [CALayer layer];
containerLayer.shadowColor = [UIColor blackColor].CGColor;
containerLayer.shadowRadius = 10.0f;
containerLayer.shadowOffset = CGSizeMake(10.0f, 5.0f);
containerLayer.shadowOpacity = .8f;
[containerLayer addSublayer:self.imageView.layer];
[self.view.layer addSublayer:containerLayer];

1。問題は、imageViewシャドウ効果を取得するためにimageView.layerをcontainerLayerに追加する必要がある理由がわからないことです。ただし、containerLayerをimageView.layerに追加すると、imageViewに影がありません。なぜですか?

エラーコードは次のとおりです。

 self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"]];
self.imageView.center = self.view.center;
CALayer *containerLayer= [CALayer layer];
/*same as before*/
[self.imageView.layer addSublayer:containerLayer];
[self.view.layer addSublayer:self.imageView.layer];

質問2:containerLayerの(imageViewに影を付けるために使用される)frame = {{0、0}、{0、0}}ですが、最終的な位置は画面の中央にあります。なぜ?

ここに画像の説明を入力してください

4

2 に答える 2

2

レイヤーの周りにシャドウを作成するには、レイヤー内に不透明なものが必要です(shadowPathを明示的に指定していない場合)。したがって、containerLayerにはサブレイヤーとしてimageViewのレイヤーがあるため、コードの最初のバージョンは機能します。しかし、質問2で気付いたように、containerLayerのフレームは、実際には(0,0)のサイズで左上隅に配置されていることを示しています。まだ画像が表示されている理由は、containerLayerがその境界をマスクしていないためです。この行を最初のバージョンに追加すると、画像が消えます。

[containerLayer setMasksToBounds: YES];  // kitten (and shadow) is gone

コードのバージョン#2は、一部、containerLayerに何も「含まれていない」ため、影を表示しません。バージョン#2を使用しているが、containerLayerに新しいフレームと不透明な背景色を指定すると、影が表示されます。(ただし、画像が覆われているため、これは明らかに解決策ではありません...)また、レイヤーの背景が[UIColor clearColor]の場合、影がないことに注意してください。

[self.imageView.layer addSublayer:containerLayer];
containerLayer.frame = self.imageView.layer.bounds;
containerLayer.backgroundColor = [UIColor yellowColor].CGColor; // yellow box w/shadow
// containerLayer.backgroundColor = [UIColor clearColor].CGColor;  // no shadow here

UIImageViewを格納するシャドウ付きのコンテナーが必要な場合は、次のようにすることができます。

UIView * shadowView = [[UIView alloc] initWithFrame: self.imageView.frame];
shadowView.layer.shadowColor = [UIColor blackColor].CGColor;
shadowView.layer.shadowRadius = 10.0f;
shadowView.layer.shadowOffset = CGSizeMake(10.0f, 5.0f);
shadowView.layer.shadowOpacity = .8f;
[self.view addSubview: shadowView];
self.imageView.frame = (CGRect) { CGPointZero, self.imageView.frame.size };
[shadowView addSubview: self.imageView];

同様の方法で、UIViewの代わりにCALayerを使用できます。または、シャドウ属性をimageViewのレイヤーに直接適用して、ビューもレイヤーも境界に対してクリッピング/マスキングされていないことを確認することもできます。

于 2012-11-08T14:47:34.790 に答える
-3

イメージビューにシャドウを追加する場合は、そのイメージビューのアルファ値(0.0分-最大1.0)を変更するだけです。これにより、シャドウ効果が得られます。シャドウを削除する場合は、アルファ値を1.0に戻すだけです。

例:

    self.imageview.alpha = 0.5 // shadow state
    self.imageview.alpha = 1.0 // original state
于 2012-11-08T07:27:58.317 に答える