在UIImageView后面创建阴影的最佳方法是什么


75

我有一个UIImageView,我想在后面添加阴影。我希望苹果拥有它作为属性,但是它们必须使我们的程序员很难做很多事情,所以我需要问这个问题。


1
您可能想使用Core Graphics绘图功能绘制阴影。
格兰特·保罗

Answers:


215

有一种更好,更轻松的方法来执行此操作。UIImageView继承自UIView,因此具有layer属性。您可以访问该图层的阴影属性和bam,然后得到一个阴影。

如果您拥有UIImageView作为nib文件的IBOutlet,则可以实现awakeFromNib例如

物镜

- (void)awakeFromNib {
    imageView.layer.shadowColor = [UIColor purpleColor].CGColor;
    imageView.layer.shadowOffset = CGSizeMake(0, 1);
    imageView.layer.shadowOpacity = 1;
    imageView.layer.shadowRadius = 1.0;
    imageView.clipsToBounds = NO;
}

别忘了 #import "QuartzCore/CALayer.h"


对于Swift,您可以通过多种方式进行处理。创建一个类扩展,子类或imageView实例。无论采用哪种方式,修改图层阴影属性的过程都是相同的。

迅捷3

override func awakeFromNib() {
    super.awakeFromNib()

    imageView.layer.shadowColor = UIColor.purple.cgColor
    imageView.layer.shadowOffset = CGSize(width: 0, height: 1)
    imageView.layer.shadowOpacity = 1
    imageView.layer.shadowRadius = 1.0
    imageView.clipsToBounds = false
}

32
您可能还需要,imageView.clipsToBounds = NO;否则阴影将被剪掉。
mxcl 2010年

18
您还需要#import“ QuartzCore / CALayer.h”
开发人员

1
@maxHowell使用clipsToBounds添加了阴影,但是现在当使用模式“宽高比填充”时,我的图像也会溢出。有没有办法修剪图像而不是阴影?
德里克·达默

6
@DerekDahmer,您将必须将imageView添加为另一个视图的子视图,然后再应用阴影,然后裁剪imageView但不裁剪容器视图。我发现没有其他方法可以处理此类问题。
mxcl

5
添加imageView.layer.shouldRasterize = YES; 加快处理速度
malaki1974'6

11

最简单的操作是在图像视图中添加阴影层:

CALayer             *layer = [CALayer layer];
CGRect              bounds = self.bounds;

layer.bounds = bounds;
layer.position = CGPointMake(bounds.size.width / 2 + 3, bounds.size.height / 2 + 3);
layer.backgroundColor = [UIColor colorWithWhite: 0.25 alpha: 0.55].CGColor;
layer.zPosition = -5;

[self.layer addSublayer: layer];

确保该视图的“剪辑子视图”已关闭


1
为什么只要将图层的边界设置为self.bounds,为什么要创建CGRect * bounds?阴影在哪里出现?
贾布(Jab)2010年

我创建一个临时变量以提高可读性;键入self.bounds比边界要长一些,并使代码的可读性降低。这层是阴影。当然,这以您具有正方形图像为前提。如果您要制作非矩形图像,则必须使用自定义图像蒙版。
Ben Gottlieb 2010年

好吧,我想让它褪色,我不知道该怎么做。请帮忙!
Jab 2010年

1
褪色完全是一个单独的任务。如果要自定义阴影(除了图像后面的简单黑色矩形以外),则应将图像拍摄并制作为蒙版(即全黑和透明),然后应用淡入淡出然后将其绘制在后面使用Quartz或粘贴到图层中的原始图片。
Ben Gottlieb 2010年

9

具有扩展功能的Swift解决方案。不需要子类化。呼叫myImage.addShadow()viewDidLoad()。这应该适用于UIViewUIImageView

extension UIView {

    func addShadow() {
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 0)
        layer.shadowOpacity = 0.5
        layer.shadowRadius = 5
        clipsToBounds = false
    }
}

当我尝试调用此函数时,我得到“ UIImage类型的值没有成员'addShadow”
user1904273

5

除此之外,如果要制作白色边框和阴影,可以使用该代码:

//shadow part
imageView.layer.shadowColor = [UIColor blackColor].CGColor;
imageView.layer.shadowOffset = CGSizeMake(0, 1);
imageView.layer.shadowOpacity = 1;
imageView.layer.shadowRadius = 1.0;
//white border part
[imageView.layer setBorderColor: [[UIColor whiteColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];

但是在这种情况下,如何使阴影部分成为.image属性的一部分,比如说在其他地方保存或显示该图像?
alejandrormz

你不能 您不是在编辑图像,而是对其进行装饰以进行显示。实际编辑位图数据复杂得多。考虑简单地在显示图像的任何地方装饰图像,因为通常您不希望处理图像来添加这些效果,除非您在后端进行批量处理。
蒂姆(Tim)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.