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

Posted

技术标签:

【中文标题】在 UIImageView 后面创建阴影的最佳方法是啥【英文标题】:What is the best way to create a shadow behind a UIImageView在 UIImageView 后面创建阴影的最佳方法是什么 【发布时间】:2011-01-03 21:47:31 【问题描述】:

我有一个 UIImageView 我想在后面添加一个阴影。我希望苹果有这个属性,但他们不得不让我们程序员做很多事情,所以我需要问这个问题。

【问题讨论】:

很可能,您想使用 Core Graphics 绘图函数来绘制阴影。 这些问题和你的很相似:***.com/questions/962827/uiimage-shadow, ***.com/questions/1943087/… 【参考方案1】:

有一种更好、更简单的方法可以做到这一点。 UIImageView 继承自 UIView 所以它有一个 layer 属性。您可以访问图层的阴影属性和 bam,您得到了一个阴影。

如果您将 UIImageView 作为 IBOutlet 指向 nib 文件,则只需实现 awakeFromNib 例如

Objective-C

- (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 实例。无论哪种方式,修改layers shadow属性的过程都是一样的。

斯威夫特 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

【讨论】:

您可能还需要imageView.clipsToBounds = NO;,否则阴影将被剪掉。 你还需要#import "QuartzCore/CALayer.h" @MaxHowell 使用 clipsToBounds 添加了阴影,但现在我的图像在使用“Aspect Fill”模式时也溢出了它的边界。有没有办法裁剪图像而不是阴影? @DerekDahmer 您必须将 imageView 添加为另一个视图的子视图,然后应用阴影,然后剪辑 imageView 而不是容器视图。我没有找到其他方法来处理这种事情。 添加 imageView.layer.shouldRasterize = YES;加快处理速度【参考方案2】:

最简单的做法是在图像视图中添加一个阴影层:

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];

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

【讨论】:

当您可以将图层的边界设置为 self.bounds 时,为什么要制作 CGRect *bounds?阴影在哪里出现? 我创建了一个临时变量以提高可读性;输入 self.bounds 比 bounds 长一点,并且使代码可读性差一些。这层是阴影。当然,这是假设你有一个正方形的图像;如果您正在制作非矩形图像,则必须使用自定义图像蒙版。 好吧,我想让它褪色,但我不知道该怎么做。请帮忙! 褪色完全是一个单独的任务。如果你想有一个自定义的阴影(不是一个简单的黑色矩形在你的图像后面),你应该把图像做成一个蒙版(即全黑和透明),应用你的淡入淡出,然后把它画在后面原件,使用 Quartz 或粘贴到图层中。【参考方案3】:

带有扩展的 Swift 解决方案。不需要子类化。从viewDidLoad() 拨打myImage.addShadow()。这应该适用于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'【参考方案4】:

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

//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 属性的阴影部分成为 .image 属性的一部分,比如说,在其他地方保存或显示该图像? 你不能。您不是在编辑图像,而是在装饰它以供显示。实际编辑位图数据要复杂得多。考虑在显示图像的任何地方简单地装饰图像,因为您通常不希望处理图像以添加这些效果,除非您在批量处理它们的后端这样做。【参考方案5】:

斯威夫特 5.x

profileImageView.layer.cornerRadius = profileImageView.frame.size.width/2
profileImageView.clipsToBounds = false
profileImageView.layer.shadowColor = UIColor.black.cgColor
profileImageView.layer.shadowOpacity = 0.7
profileImageView.layer.shadowOffset =  CGSize(width: 2, height: 2)
profileImageView.layer.shadowRadius = 10

【讨论】:

以上是关于在 UIImageView 后面创建阴影的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIImage 边界上创建阴影效果

为具有圆角的UIImageView创建阴影?

如何为我的 UIImageView 创建白色边框和黑色阴影?

仅 UIImageView 顶部和底部的内部阴影(目标 C)

如何在 UIImageView iOS 上设置阴影渐变图像

向 UIView 添加黑色阴影的最佳方法是啥