单击按钮时如何更改CAShaperLayer的笔触颜色

时间:2019-05-31 12:27:18

标签: ios swift uibezierpath cashapelayer

我已经创建了一些自定义图层并添加到UIView上,我有两个CAShaper图层,但是我仅在此处显示一个示例

    hexBorderOtline = CAShapeLayer()
    hexBorderOtline.name = "dhiru_border_hidden"
    hexBorderOtline.path = path2.cgPath
    hexBorderOtline.lineCap = .round  
    hexBorderOtline.strokeColor = inActiveBorderColor.cgColor
    hexBorderOtline.fillColor = UIColor.clear.cgColor
    self.layer.addSublayer(hexBorderOtline)

我想在单击按钮时更改其边框颜色。

func btnAction()
{
    hexBorderOtline.strokeColor = activeBorderColor.cgColor
}

但是这不起作用,我正在发布一张参考图像,只需单击一下按钮即可完成。

enter image description here

3 个答案:

答案 0 :(得分:0)

尝试一下:

func btnAction()
{
    hexBorderOtline.removeFromSuperlayer()
    hexBorderOtline.strokeColor = activeBorderColor.cgColor
    self.layer.addSublayer(hexBorderOtline)
}

没有UIView:

class ViewController: UIViewController {

var hexBorderOtline: CAShapeLayer!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    hexBorderOtline = CAShapeLayer()
    hexBorderOtline.name = "dhiru_border_hidden"
    hexBorderOtline.path = UIBezierPath(arcCenter: CGPoint(x:self.view.frame.size.width/2, y: self.view.frame.size.height/2), radius: self.view.frame.size.height/2, startAngle: 180, endAngle: 0.0, clockwise: true).cgPath
    hexBorderOtline.lineCap = .round
    hexBorderOtline.strokeColor = UIColor.gray.cgColor
    hexBorderOtline.fillColor = UIColor.clear.cgColor
    self.view.layer.addSublayer(hexBorderOtline)
}

@IBAction func updateColor(_ sender: Any) {
    hexBorderOtline.removeFromSuperlayer()
    hexBorderOtline.strokeColor = UIColor.red.cgColor
    self.view.layer.addSublayer(hexBorderOtline)
}

}

答案 1 :(得分:0)

如果只有两层显示具有颜色的活动和不活动模式,则可以创建两个具有不同笔触颜色的单独层,并将它们作为子层添加到主层中。您想要显示的默认图层颜色应在之后添加。单击该按钮后,您只需要隐藏/显示子图层即可。

希望这会有所帮助。

答案 2 :(得分:0)

您切换形状图层的笔触颜色的方法是正确的:

enter image description here

我正在做的是:

var enabled = false

@IBAction func didTapButton(_ sender: Any) {
    enabled = !enabled
    hexBorderOtline.strokeColor = enabled ? activeBorderColor.cgColor : inActiveBorderColor.cgColor
}

因此,您的问题出在其他地方。例如:

  • 也许您要更改颜色的图层上有另一个形状图层。

  • 也许您的ivar指向另一个形状层。

  • 或者您的按钮可能未连接到btnAction例程(缺少任何@IBAction@objc会让我怀疑您没有调用此例程) 。

这将是简单的事情。

我建议您在创建print(hexBorderOtline)的位置添加CAShapeLayer,然后在btnAction中再次添加并确认两者:

  1. 您会看到两组print语句;和

  2. 他们正在打印与形状层关联的相同内存地址(即,确保它们引用的是同一形状层)。

但这一定是这样的。这是更改strokeColor的正确方法,它将自动为您更新形状图层。您的问题出在其他地方。