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. 问题是不知道为什么要在containerLayer中加入imageView.layer才能得到imageView的阴影效果。但是,如果我将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];

可以以类似的方式使用 CALayer 代替 UIView。或者您可以直接将阴影属性应用到 imageView 的图层,确保视图和图层都没有剪切/屏蔽边界。

于 2012-11-08T14:47:34.790 回答
-3

如果要在图像视图上添加阴影,只需更改该图像视图的 alpha 值(0.0 min - 1.0 max)。这将为您提供阴影效果,每当您想要移除阴影时,只需将 alpha 值恢复为 1.0。

例如:

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