什么是最好的方式添加投影到我的UIView

我想添加一个投影到另一个顶层的视图,视图崩溃允许其他视图中的内容被看到,在这一点上,我想保持view.clipsToBounds ON,以便当视图合拢它们的内容被裁剪。

这似乎已经使我难以添加投影到图层,因为当我把clipsToBounds在阴影也剪辑。

我一直试图操纵view.frameview.bounds为了添加一个阴影的框架,但允许边界足够大,包括它,但是我没有这样的运气。

这里是我用来添加阴影的代码(这只适用于所示的clipsToBounds OFF)

 view.clipsToBounds = NO; view.layer.shadowColor = [[UIColor blackColor] CGColor]; view.layer.shadowOffset = CGSizeMake(0,5); view.layer.shadowOpacity = 0.5; 

以下是应用于最浅灰色图层的阴影的截图。 希望这给了我的内容将如何重叠如果clipsToBoundsclosures的想法。

阴影应用。

我如何添加阴影到我的UIView并保持我的内容剪辑?

编辑:只是想补充一点,我也玩过使用背景图像阴影,这确实很好,但我仍然想知道最好的编码解决scheme。

尝试这个:

 UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:view.bounds]; view.layer.masksToBounds = NO; view.layer.shadowColor = [UIColor blackColor].CGColor; view.layer.shadowOffset = CGSizeMake(0.0f, 5.0f); view.layer.shadowOpacity = 0.5f; view.layer.shadowPath = shadowPath.CGPath; 

首先 :用作shadowPath至关重要。 如果你不使用它,你可能一开始并没有注意到有什么不同,但是敏锐的眼睛会观察到在旋转设备和/或类似的事件时发生的某种滞后。 这是一个重要的性能调整。

关于你的问题 :重要的一行是view.layer.masksToBounds = NO 。 它禁止视图的图层的子图层的裁剪比视图的边界延伸得更远。

对于那些想知道masksToBounds (在图层上)和视图自己的clipToBounds属性之间有什么区别的人来说:没有任何东西。 切换一个会对另一个有影响。 只是一个不同的抽象层次。


Swift 2.2:

 override func layoutSubviews() { super.layoutSubviews() let shadowPath = UIBezierPath(rect: bounds) layer.masksToBounds = false layer.shadowColor = UIColor.blackColor().CGColor layer.shadowOffset = CGSizeMake(0.0, 5.0) layer.shadowOpacity = 0.5 layer.shadowPath = shadowPath.CGPath } 

Swift 3:

 override func layoutSubviews() { super.layoutSubviews() let shadowPath = UIBezierPath(rect: bounds) layer.masksToBounds = false layer.shadowColor = UIColor.black.cgColor layer.shadowOffset = CGSize(width: 0.0, height: 5.0) layer.shadowOpacity = 0.5 layer.shadowPath = shadowPath.cgPath } 

Wasabii在Swift 2.3中的答案:

  let shadowPath = UIBezierPath(rect: view.bounds) view.layer.masksToBounds = false view.layer.shadowColor = UIColor.blackColor().CGColor view.layer.shadowOffset = CGSize(width: 0, height: 0.5) view.layer.shadowOpacity = 0.2 view.layer.shadowPath = shadowPath.CGPath 

在Swift 3/4:

  let shadowPath = UIBezierPath(rect: view.bounds) view.layer.masksToBounds = false view.layer.shadowColor = UIColor.black.cgColor view.layer.shadowOffset = CGSize(width: 0, height: 0.5) view.layer.shadowOpacity = 0.2 view.layer.shadowPath = shadowPath.cgPath 

把这个代码放在layoutSubviews()中,如果你使用的是AutoLayout。

诀窍是适当地定义视图图层的masksToBounds属性:

 view.layer.masksToBounds = NO; 

它应该工作。

( 来源 )

在viewWillLayoutSubviews:

 override func viewWillLayoutSubviews() { sampleView.layer.masksToBounds = false sampleView.layer.shadowColor = UIColor.darkGrayColor().CGColor; sampleView.layer.shadowOffset = CGSizeMake(2.0, 2.0) sampleView.layer.shadowOpacity = 1.0 } 

使用UIView的扩展:

 extension UIView { func addDropShadowToView(targetView:UIView? ){ targetView!.layer.masksToBounds = false targetView!.layer.shadowColor = UIColor.darkGrayColor().CGColor; targetView!.layer.shadowOffset = CGSizeMake(2.0, 2.0) targetView!.layer.shadowOpacity = 1.0 } } 

用法:

 sampleView.addDropShadowToView(sampleView) 

您可以为UIView创build一个扩展,以在devise编辑器中访问这些值

设计编辑器中的阴影选项

 extension UIView{ @IBInspectable var shadowOffset: CGSize{ get{ return self.layer.shadowOffset } set{ self.layer.shadowOffset = newValue } } @IBInspectable var shadowColor: UIColor{ get{ return UIColor(cgColor: self.layer.shadowColor!) } set{ self.layer.shadowColor = newValue.cgColor } } @IBInspectable var shadowRadius: CGFloat{ get{ return self.layer.shadowRadius } set{ self.layer.shadowRadius = newValue } } @IBInspectable var shadowOpacity: Float{ get{ return self.layer.shadowOpacity } set{ self.layer.shadowOpacity = newValue } } }