使用 UIButton 的 z 顺序将子层或 UIView 作为子视图添加到顶部仍然在视图后面或看起来透明

Adding a sub layer or UIView as subview to the top using z-order of UIButton still goes behind the view or look transparent

我有一个 UIButton,我想在上面添加一个圆形徽章,这是它的样子。

public func addCircleBadge(_ width: CGFloat, color: UIColor) {
        let bounds = self.mybtn.bounds
        let layer = CAShapeLayer()
        let radius = width / 2
        layer.path = UIBezierPath(roundedRect: CGRect(x: bounds.width - (radius + 2.0), y: bounds.minY - (radius-2.0), width: width, height: width), cornerRadius: radius).cgPath
        layer.fillColor = color.cgColor
        layer.zPosition = 999
        layer.name = "circleBadge"
        self.mybtn.layer.addSublayer(layer)
    }

并在 viewDidLoad()

override func viewDidLoad() {
    super.viewDidLoad()
    mybtn.layer.borderColor = UIColor.blue.cgColor
    mybtn.layer.cornerRadius = 3.0
    mybtn.layer.borderWidth = 2.0
    mybtn.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    addCircleBadge(20, color: UIColor.red.withAlphaComponent(1.0))
}

但是这个层看起来是透明的,所以按钮区域是可见的,我想在按钮上面有一个不透明层。可以通过图层完成还是我需要添加不同的视图并将按钮和这个单独的 UIView 放在一个公共视图

据我了解,您为 button.layer 设置了 borderWidthborderColor。 此 button.layer 承载您添加到其中的所有其他子图层,这就是为什么您的边框始终位于顶部的原因。

因此您可以使用附加视图来绘制圆或... 只需为 button.layer 删除设置 borderWidthborderColor 并添加另一个将覆盖边界的子图层。

例如:

    func addBorder(borderWidth: CGFloat = 1.0, borderColor: UIColor = UIColor.blue) {
        let layer = CALayer()
        let frame = self.mybtn.frame
        layer.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)
        layer.borderColor = borderColor.cgColor
        layer.borderWidth = borderWidth
        self.mybtn.layer.addSublayer(layer)
    }

并在 ViewDidLoad 中:

    override func viewDidLoad() {
        super.viewDidLoad()
        addBorder()
        addCircleBadge(20, color: UIColor.red)
    }

addCircleBadge

还有一个更新
    public func addCircleBadge(_ width: CGFloat, color: UIColor) {
        ...

        self.mybtn.layer.insertSublayer(layer, at: 0)
    }