使用 UIBezierPath 向 UIView 添加阴影
Posted
技术标签:
【中文标题】使用 UIBezierPath 向 UIView 添加阴影【英文标题】:Adding shadow to UIView with UIBezierPath 【发布时间】:2020-05-26 22:37:53 【问题描述】:我正在 UIView 的 draw rect 方法中创建自定义形状。这是一个箭头,它正在工作,但我无法添加阴影。我试图为 View 本身和图层添加阴影,但它不起作用。任何帮助将不胜感激。
import UIKit
class ArrowView: UIView
override func draw(_ rect: CGRect)
//Drawing Arrow
let path = UIBezierPath()
let edge:CGFloat = 20.0
path.move(to: CGPoint(x: 0.0, y: 0.0))
path.addLine(to: CGPoint(x: self.frame.width - edge, y: 0.0))
path.addLine(to: CGPoint(x: self.frame.width , y: self.frame.height/2))
path.addLine(to: CGPoint(x: self.frame.width - edge , y: self.frame.height))
path.addLine(to: CGPoint(x: 0, y: self.frame.height))
path.close()
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
【问题讨论】:
“它不起作用”不是很有帮助。请详细说明您的意思。 @koen - 表示它没有显示阴影。我认为这很清楚。 【参考方案1】:这里是你如何获得阴影
import UIKit
@IBDesignable
class ArrowView: UIView
private lazy var arrowLayer : CALayer =
let layer = CALayer()
layer.backgroundColor = UIColor.red.cgColor
return layer
()
override init(frame: CGRect)
super.init(frame: frame)
setupView()
required init?(coder: NSCoder)
super.init(coder: coder)
setupView()
func setupView()
self.backgroundColor = .clear
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 1
layer.shadowOffset = .zero
layer.shadowRadius = 10
layer.addSublayer(arrowLayer)
private func updatePath()
let path = UIBezierPath()
let edge:CGFloat = 20.0
path.move(to: CGPoint(x: 0.0, y: 0.0))
path.addLine(to: CGPoint(x: self.bounds.size.width - edge, y: 0.0))
path.addLine(to: CGPoint(x: self.bounds.size.width , y: self.bounds.size.height/2))
path.addLine(to: CGPoint(x: self.bounds.size.width - edge , y: self.bounds.size.height))
path.addLine(to: CGPoint(x: 0, y: self.bounds.size.height))
path.close()
arrowLayer.frame = self.bounds
let mask = CAShapeLayer()
mask.path = path.cgPath
arrowLayer.mask = mask
override func layoutSubviews()
updatePath()
【讨论】:
希望对你有帮助:) 太棒了。你能解释一下吗?我真的很想了解其中的逻辑。 如果你遮住了一个图层......你不能给它阴影......所以我屏蔽了其他一些图层......并给主图层提供阴影......请避免使用绘图方法.. .. 谢谢,但您的解决方案有问题。当我屏蔽主层时,我能够在主 UIView 中添加子视图。现在,如果我添加一个 subView,它甚至会在 UIBezierPath 之外显示在整个视图中。以上是关于使用 UIBezierPath 向 UIView 添加阴影的主要内容,如果未能解决你的问题,请参考以下文章
使用 Pan Gesture 将 UIView 拖到 UIBezierPath 上