所以我有一个用uibezierpath绘制的圆,我需要将superview设置为与圆相同,下面是我的代码:

   override func draw(_ rect: CGRect) {
    let circlePath = UIBezierPath(arcCenter: CGPoint(x: rect.midX, y: rect.midY), radius: circleRadius, startAngle: 0.0, endAngle:CGFloat(Double.pi * 2), clockwise: true)
    let strokeColorAnimation = CABasicAnimation(keyPath: "strokeColor")
    let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")

    shapeLayer.path = circlePath.cgPath
    shapeLayer.lineWidth = 0.3 * circleRadius
    shapeLayer.fillColor = UIColor.clear.cgColor

    if oldColor == nil { oldColor = newColor }
    if oldStrokeEnd == nil { oldStrokeEnd = 0.01 * currentCGFloatProximity }

    strokeColorAnimation.fromValue = oldColor!.cgColor
    strokeColorAnimation.toValue = newColor.cgColor
    strokeColorAnimation.duration = 0.3
    strokeColorAnimation.isRemovedOnCompletion = false
    strokeColorAnimation.fillMode = kCAFillModeForwards

    strokeEndAnimation.fromValue = oldStrokeEnd
    strokeEndAnimation.toValue = 0.01 * currentCGFloatProximity
    strokeEndAnimation.duration = 0.3
    strokeEndAnimation.isRemovedOnCompletion = false
    strokeEndAnimation.fillMode = kCAFillModeForwards

    shapeLayer.add(strokeColorAnimation, forKey: strokeColorAnimation.keyPath)
    shapeLayer.add(strokeEndAnimation, forKey: strokeEndAnimation.keyPath)

    layer.mask = shapeLayer


   // layer.addSublayer(shapeLayer)


    oldColor = newColor
    oldStrokeEnd = 0.01 * currentCGFloatProximity
}

当我添加到Superview的图层蒙版中时,我得到的结果是,它是黑色的,不改变颜色:
swift - 将图层蒙版设置为UIBezierPath super  View-LMLPHP
    //layer.mask = shapeLayer

    layer.addSublayer(shapeLayer)

当我将子层添加到SuperView的层时,会得到以下结果:
swift - 将图层蒙版设置为UIBezierPath super  View-LMLPHP
我只想得到第一张图片的结果,但要有彩色圆圈。希望得到帮助。对不起我的英语。

最佳答案

好的,我通过添加新的形状层修复了它,但是也许有人有更好的解决方案。
现在我有了这个密码:

override func draw(_ rect: CGRect) {
    let circlePath = UIBezierPath(arcCenter: CGPoint(x: rect.midX, y: rect.midY), radius: circleRadius, startAngle: 0.0, endAngle:CGFloat(Double.pi * 2), clockwise: true)
    let strokeColorAnimation = CABasicAnimation(keyPath: "strokeColor")
    let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")

    circleLayer.path = circlePath.cgPath
    circleLayer.lineWidth = 0.3 * circleRadius
    circleLayer.fillColor = UIColor.clear.cgColor

    backgroundLayer.path = circlePath.cgPath
    backgroundLayer.lineWidth = 0.3 * circleRadius
    backgroundLayer.strokeColor = UIColor.black.cgColor
    backgroundLayer.fillColor = UIColor.clear.cgColor


    if oldColor == nil { oldColor = newColor }
    if oldStrokeEnd == nil { oldStrokeEnd = 0.01 * currentCGFloatProximity }

    strokeColorAnimation.fromValue = oldColor!.cgColor
    strokeColorAnimation.toValue = newColor.cgColor
    strokeColorAnimation.duration = 0.3
    strokeColorAnimation.isRemovedOnCompletion = false
    strokeColorAnimation.fillMode = kCAFillModeForwards

    strokeEndAnimation.fromValue = oldStrokeEnd
    strokeEndAnimation.toValue = 0.01 * currentCGFloatProximity
    strokeEndAnimation.duration = 0.3
    strokeEndAnimation.isRemovedOnCompletion = false
    strokeEndAnimation.fillMode = kCAFillModeForwards

    circleLayer.add(strokeColorAnimation, forKey: strokeColorAnimation.keyPath)
    circleLayer.add(strokeEndAnimation, forKey: strokeEndAnimation.keyPath)

    layer.mask = backgroundLayer

    layer.addSublayer(circleLayer)
    oldColor = newColor
    oldStrokeEnd = 0.01 * currentCGFloatProximity
}

swift - 将图层蒙版设置为UIBezierPath super  View-LMLPHP

10-05 20:42
查看更多