【问题标题】:How can I change the color of an element using a UIBezierPath?如何使用 UIBezierPath 更改元素的颜色?
【发布时间】:2015-04-08 00:09:26
【问题描述】:

stackoverflow 上的第一篇文章,首先,你好!

我是第一次尝试 Swift 并且正在处理一个项目,只是需要一些帮助来解决我遇到的问题。我有一个使用 UIBezierPath 的圆圈,我想动态地改变它的颜色。但是,当我尝试对颜色进行“硬编码”时,我无法让它改变。我试过看这里:How to change the color of a UIBezierPath in Swift?,但它没有回答我的问题。但是,我确实看到那里的一个答案确实表明贝塞尔路径没有颜色。如果是这样,那么我将如何改变沿其路径的圆圈的颜色?

这是我正在使用的代码:

    outerCircle.path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).CGPath
    outerCircle.lineWidth = 8.0
    outerCircle.strokeStart = 0.0
    outerCircle.strokeEnd = 0.45
    outerCircle.lineCap = kCALineCapRound
    outerCircle.fillColor = UIColor.clearColor().CGColor
    outerCircle.strokeColor = UIColor.grayColor().CGColor
    outerCircleView.layer.addSublayer(outerCircle)

    outerCircle.strokeStart = 0.0
    outerCircle.strokeEnd = 1.0

    vibrancyView.contentView.addSubview(outerCircleView)

    innerCircleView.frame.size = frameSize

    let innerCirclePadding: CGFloat = 12
    innerCircle.path = UIBezierPath(ovalInRect: CGRect(x: innerCirclePadding, y: innerCirclePadding, width: frameSize.width - 2*innerCirclePadding, height: frameSize.height - 2*innerCirclePadding)).CGPath
    innerCircle.lineWidth = 4.0
    innerCircle.strokeStart = 0.5
    innerCircle.strokeEnd = 0.9
    innerCircle.lineCap = kCALineCapRound
    innerCircle.fillColor = UIColor.clearColor().CGColor
    innerCircle.strokeColor = UIColor.grayColor().CGColor
    innerCircleView.layer.addSublayer(innerCircle)

再次,如果这是一个明显的答案或已经回答,我深表歉意。我感谢任何可以帮助我指明正确方向的建议。谢谢。

更新:这就是我尝试做的。我把内圈和外圈的填充和描边颜色都改成了绿色,但还是有清晰的圆圈:

        outerCircle.path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).CGPath
    outerCircle.lineWidth = 8.0
    outerCircle.strokeStart = 0.0
    outerCircle.strokeEnd = 0.45
    outerCircle.lineCap = kCALineCapRound
    outerCircle.fillColor = UIColor.greenColor().CGColor
    outerCircle.strokeColor = UIColor.greenColor().CGColor
    outerCircleView.layer.addSublayer(outerCircle)

    outerCircle.strokeStart = 0.0
    outerCircle.strokeEnd = 1.0

    vibrancyView.contentView.addSubview(outerCircleView)

    innerCircleView.frame.size = frameSize

    let innerCirclePadding: CGFloat = 12
    innerCircle.path = UIBezierPath(ovalInRect: CGRect(x: innerCirclePadding, y: innerCirclePadding, width: frameSize.width - 2*innerCirclePadding, height: frameSize.height - 2*innerCirclePadding)).CGPath
    innerCircle.lineWidth = 4.0
    innerCircle.strokeStart = 0.5
    innerCircle.strokeEnd = 0.9
    innerCircle.lineCap = kCALineCapRound
    innerCircle.fillColor = UIColor.greenColor().CGColor
    innerCircle.strokeColor = UIColor.greenColor().CGColor
    innerCircleView.layer.addSublayer(innerCircle)

我想让圆圈改变颜色。

【问题讨论】:

  • 那些将是外圈和内圈的操作。知道了。谢谢!正是我正在寻找的指导。我试图改变 fillColor 和 strokeColor,但我需要使用这两个函数。谢谢!正是我想要的。出于好奇,如果您不介意解释,那么上面的代码中的fillColor和strokeColor是做什么的?
  • innerCircleouterCircle 是什么?他们是否有机会塑造图层?如果是这样,您不认为在您的问题中提及这一事实可能是个好主意吗?
  • 好的,就目前而言,您所做的是正确的。那有什么问题吗?显示更多您的代码。充分展示其他人可以运行您的代码。并且解释问题是什么——运行代码时发生了什么,另一方面,你希望发生什么?
  • 我要做的是编辑innerCircle和outerCircle的颜色。尝试手动更改 fillColor 和 strokeColor 元素对我不起作用。我必须改用 setStroke 和 setFill 吗?
  • “对我不起作用”是什么意思?我可以看到您正在设置他们的fillColorstrokeColor 属性。这是正确的,并且有效。我再次问,问题是什么?

标签: ios iphone swift uibezierpath


【解决方案1】:

路径没有颜色。是一条路!只有图形上下文具有描边颜色/填充颜色。迟早你会有一个图形上下文——没有一个贝塞尔路径是没有用的。当您这样做时,将其路径设置为您的贝塞尔路径,根据需要设置其描边/填充颜色,然后描边/填充路径。瞧。

在您的情况下,您似乎有一对 CAShapeLayer 对象。您可以更改它们的描边/填充颜色,因为它们具有图形上下文 - 它们采用您给它们的路径和颜色,并通过填充和描边路径为您绘制它们。美好的。但是您不能更改贝塞尔路径的笔触或填充颜色 - 它只是一条路径。整个概念毫无意义。

说了这么多,还不清楚你遇到了什么问题。根据您的代码,我运行了以下代码:

class ViewController: UIViewController {
    @IBOutlet weak var outerCircleView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let outerCircle = CAShapeLayer()
        let frameSize = outerCircleView.frame.size
        outerCircle.path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).CGPath
        outerCircle.lineWidth = 8.0
        outerCircle.strokeStart = 0.0
        outerCircle.strokeEnd = 0.45
        outerCircle.lineCap = kCALineCapRound
        outerCircle.fillColor = UIColor.clearColor().CGColor
        outerCircle.strokeColor = UIColor.grayColor().CGColor
        outerCircleView.layer.addSublayer(outerCircle)

    }
}

它构建并运行,我看到正是我期望看到的:一个厚厚的灰色部分圆圈:

那是因为这个形状图层有一个清晰的填充颜色和一个灰色的描边颜色。如果您不喜欢这些颜色,请让形状图层为您提供不同的颜色。

更新您更新了代码以显示涉及绿色填充和描边的第二个版本。所以我尝试了你的第二个代码:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let outerCircle = CAShapeLayer()
    let frameSize = outerCircleView.frame.size
    outerCircle.path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).CGPath
    outerCircle.lineWidth = 8.0
    outerCircle.strokeStart = 0.0
    outerCircle.strokeEnd = 0.45
    outerCircle.lineCap = kCALineCapRound
    outerCircle.fillColor = UIColor.greenColor().CGColor
    outerCircle.strokeColor = UIColor.greenColor().CGColor
    outerCircleView.layer.addSublayer(outerCircle)

    outerCircle.strokeStart = 0.0
    outerCircle.strokeEnd = 1.0

}

而且,正如预期的那样,我得到了一个绿色圆圈(它不是一个精确的圆圈,但这只是因为我的视图不是一个完美的正方形):

所以我还是看不出问题应该是什么:你的代码做了我期望你的代码做的事情。

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多