【问题标题】:Adding shadow to UIView with UIBezierPath使用 UIBezierPath 向 UIView 添加阴影
【发布时间】: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 - 表示它没有显示阴影。我认为这很清楚。

标签: ios swift uiview uibezierpath


【解决方案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 之外显示在整个视图中。
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 2020-07-22
  • 2020-05-21
相关资源
最近更新 更多