什么是最好的方式添加投影到我的UIView
我想添加一个投影到另一个顶层的视图,视图崩溃允许其他视图中的内容被看到,在这一点上,我想保持view.clipsToBounds
ON,以便当视图合拢它们的内容被裁剪。
这似乎已经使我难以添加投影到图层,因为当我把clipsToBounds
在阴影也剪辑。
我一直试图操纵view.frame
和view.bounds
为了添加一个阴影的框架,但允许边界足够大,包括它,但是我没有这样的运气。
这里是我用来添加阴影的代码(这只适用于所示的clipsToBounds
OFF)
view.clipsToBounds = NO; view.layer.shadowColor = [[UIColor blackColor] CGColor]; view.layer.shadowOffset = CGSizeMake(0,5); view.layer.shadowOpacity = 0.5;
以下是应用于最浅灰色图层的阴影的截图。 希望这给了我的内容将如何重叠如果clipsToBounds
closures的想法。
我如何添加阴影到我的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 } } }