将CAShapeLayer添加到UIButton但它出现在边框线

时间:2018-01-03 03:17:48

标签: ios uibutton cashapelayer

我想在UIButton的边框添加一个红点。我目前添加点的代码是这样的:

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setUp()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setUp()
    }

    override func setUp() {
        super.setUp()
        layer.borderWidth = borderWidth
        layer.borderColor = normalBorderColor.cgColor

        let redDotLayer = CAShapeLayer()
        redDotLayer.path = CGPath(ellipseIn: CGRect(x: 30, y: -3.5, width: 8, height: 8), transform: nil)
        redDotLayer.fillColor = UIColor.red.cgColor
        layer.addSublayer(redDotLayer)
    }

然而,当我添加红点时,它会在 边框线下显示。我需要它在边界线之上。

enter image description here

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

CALayers可能最后画出自己的边框。我认为最简单的解决方案就是在单独的图层中绘制边框,以便控制顺序。

override func setUp() {
  super.setUp()

  let borderLayer = CALayer()
  borderLayer.borderWidth = borderWidth
  borderLayer.borderColor = normalBorderColor.cgColor
  layer.addSublayer(borderLayer)

  let redDotLayer = CAShapeLayer()
  redDotLayer.path = CGPath(ellipseIn: CGRect(x: 30, y: -3.5, width: 8, height: 8), transform: nil)
  redDotLayer.fillColor = UIColor.red.cgColor
  layer.addSublayer(redDotLayer)
}

答案 1 :(得分:0)

你的做法没有错。

  1. 例如,只考虑将子视图添加到父UIView,子视图始终保留在父视图中,不能添加到父视图上方。
  2. 同样的情况适用于CALayer。您不能{父母图层上方addSublayer
  3. 作为例外,
  4.   

    与视图不同,超级图层不会自动剪切位于其边界矩形之外的子图层的内容。相反,超级层允许其子层默认显示为完整。但是,您可以通过将图层的masksToBounds属性设置为YES来重新启用剪辑。

    根据苹果文档子图层可以超出父可见区域,但不能超过父级。

    1. 即使是以下方法也无济于事。

      - insertSublayer:atIndex:

      - insertSublayer:above:

      - insertSublayer:below:

    2.   
          
      • addSublayer:   将图层附加到图层的子图层列表。
      •   

      解决方案

      在按钮周围画另一个CAShapeLayer