【问题标题】:How to change stroke color of CAShaperLayer on button click如何在单击按钮时更改 CAShaperLayer 的笔触颜色
【发布时间】:2019-05-31 12:27:18
【问题描述】:

我已经创建了一些自定义层并添加到 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
}

但这不起作用,我发布了一张参考图片,我需要点击按钮。

【问题讨论】:

  • hexBorderOtline 是如何定义的?
  • 我已经添加了代码,我如何初始化var hexBorderOtline:CAShapeLayer!`
  • hexBorderOtline 必须是全局变量,并在主线程上使用 hexBorderOtline.strokeColor = UIColor.blue.cgColor 更改按钮的颜色。我刚刚尝试并且可以工作,如果不起作用,您会丢失对象的引用或在新线程中工作,请确保您在主线程上。

标签: ios swift uibezierpath cashapelayer


【解决方案1】:

你切换形状图层描边颜色的方法是正确的:

我所做的只是:

var enabled = false

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

所以,您的问题出在其他地方。例如:

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

  • 或者你的 ivar 指向另一个形状层。

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

这将是一些简单的事情。

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

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

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

但它必须是这样的。这是更改strokeColor 的正确方法,它将自动为您更新形状图层。你的问题在别处。

【讨论】:

  • 你是如何创建整形层的,你可以发帖吗,我已经创建了从实际操作按钮调用的 btnAction 不同的函数。
  • 您是要屏蔽该图层还是添加为图层?
  • 我剪切并粘贴了您的代码,所以它与您的问题完全相同(这就是我使用 hexBorderOtline 名称的原因;哈哈)。我把线加粗了,这样你就可以更清楚地看到它,但没有它,它的工作原理是一样的。这里绝对没有什么特别之处。将形状图层添加为子图层,设置其路径,然后当您更改其strokeColor时,形状图层会更改颜色。就这么简单。创建空白项目并尝试。它工作正常。一定有其他事情发生,不包括你的问题。您是否进行了我在回答中概述的诊断?
【解决方案2】:

试试这个:

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)
    }
}

【讨论】:

  • 您正在使用 UIView。请不用 UIView 试试
【解决方案3】:

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2019-05-20
    • 2021-10-18
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多