如何更改CAShapeLayer alpha / opacity值?

时间:2017-12-01 14:43:39

标签: ios swift cashapelayer

无论我做什么,我都无法改变CAShapeLayer的不透明度。我尝试设置不透明度:

    bottomProgressBar.strokeColor = UIColor.white.cgColor
    bottomProgressBar.opacity = 0.1

没有工作。然后我尝试了这个:

bottomProgressBar.strokeColor = UIColor(displayP3Red: 255, green: 255, blue: 255, alpha: 0.1).cgColor

在这两种情况下,alpha值为1.
还有另一种方法吗?或者我把它们弄错了?

编辑:

这是我的代码:
这是一个继承自UIView

的类
override init(frame: CGRect) {
    super.init(frame: frame)
    configure()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    configure()
}

func configure() {
    bottomProgressBar.strokeColor = UIColor.white.cgColor
    bottomProgressBar.opacity = 0.1
    bottomProgressBar.lineWidth = self.frame.height
    bottomProgressBar.strokeStart = 0
    bottomProgressBar.strokeEnd = 1
    self.layer.addSublayer(bottomProgressBar)

    topProgressBar.strokeColor = UIColor.white.cgColor
    topProgressBar.lineWidth = self.frame.height
    topProgressBar.strokeStart = 0
    topProgressBar.strokeEnd = 1
    self.layer.addSublayer(topProgressBar)
}

编辑2:

override func layoutSubviews() {
    super.layoutSubviews()

    let path = UIBezierPath()
    path.move(to: CGPoint(x: 0, y: 0))
    path.addLine(to: CGPoint(x: self.frame.width, y: 0))

    bottomProgressBar.path = path.cgPath
    topProgressBar.path = path.cgPath
}

编辑3:

enter image description here

2 个答案:

答案 0 :(得分:0)

我认为发生的事情是你没有为要渲染的形状定义路径。

    func configure() {
        let path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height))
        bottomProgressBar.frame = self.frame
        bottomProgressBar.bounds = self.bounds
        bottomProgressBar.path = path.cgPath
        bottomProgressBar.strokeColor = UIColor.red.cgColor
        bottomProgressBar.opacity = 0.1
//      no need for the following line as dimensions are already defined
//      bottomProgressBar.lineWidth = self.frame.height
//      bottomProgressBar.strokeStart = 0
//      bottomProgressBar.strokeEnd = 200
        self.layer.addSublayer(bottomProgressBar)

        // path width divided by 2 for demo
        let topPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: self.frame.width/2, height: self.frame.height))
        topProgressBar.frame = self.frame
        topProgressBar.bounds = self.bounds
        topProgressBar.path = topPath.cgPath
        topProgressBar.strokeColor = UIColor.green.cgColor
        self.layer.addSublayer(topProgressBar)
    }

希望这有帮助。

答案 1 :(得分:0)

奇怪的是,它对您不起作用,因为.opacity改变了layer's alpha对我来说:

let circularPath = UIBezierPath(arcCenter: view.center,
                                          radius: (100,
                                          startAngle: -.pi/2,
                                          endAngle: 3 * .pi/2,
                                          clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circularPath.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineWidth = 6

shapeLayer.opacity = 0.3 // *** fades out the shape layer ***