Как изменить цвет обводки CAShaperLayer по нажатию кнопки - PullRequest
0 голосов
/ 31 мая 2019

Я создал собственный слой и добавил его в 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 ]

1 голос
/ 01 июня 2019

Ваш метод переключения цвета обводки слоя формы правильный:

enter image description here

Все, что я делаю, это:

var enabled = false

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

Итак, ваша проблема лежит в другом месте.Например:

  • Возможно, у вас есть другой слой фигуры, который находится поверх слоя, для которого вы меняете цвет.

  • Или, возможно, ваш ивар указывает на другой слой формы.

  • Или, возможно, ваша кнопка не подключена к вашей btnAction процедуре (отсутствие каких-либо @IBAction или @objc заставляет меня подозревать, что вы не вызываете эту процедуру),

Это будет нечто простое.

Я бы предложил добавить print(hexBorderOtline), где вы создаете CAShapeLayer, и снова в btnActionи подтвердите, что оба:

  1. Вы видите оба набора print операторов;и

  2. Они печатают один и тот же адрес памяти, связанный со слоем формы (т.е. убедитесь, что они ссылаются на один и тот же слой формы).

Но это должно быть что-то подобное.Это правильный способ изменить strokeColor, который автоматически обновит слой формы.Ваша проблема лежит в другом месте.

0 голосов
/ 31 мая 2019

Если у вас есть только 2 слоя, которые показывают активный и неактивный режимы с цветами, вы можете создать два отдельных слоя с разным цветом обводки и добавить их в качестве подслоев в основной слой. Цвет слоя по умолчанию, который вы хотите показать, должен быть добавлен позже. Когда кнопка нажата, вам нужно только скрыть / показать подслои, и все будет хорошо.

Надеюсь, это поможет.

0 голосов
/ 31 мая 2019

Попробуйте это:

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

}
...