在 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()
。这应该适用于UIView
和UIImageView
。
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 后面创建阴影的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
如何为我的 UIImageView 创建白色边框和黑色阴影?