Добавление подслоя или UIView в качестве подпредставления к верху с использованием z-порядка UIButton все еще идет за представление или выглядит прозрачным - PullRequest
0 голосов
/ 20 марта 2019

У меня есть 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 with ca layer

1 Ответ

1 голос
/ 20 марта 2019

Как я понимаю, вы устанавливаете borderWidth и borderColor для button.layer. На этом button.layer размещаются все остальные подслои, которые вы добавляете к ним, поэтому ваша граница всегда находится сверху.

Таким образом, вы можете использовать дополнительный вид для рисования круга или ... Просто удалите настройки borderWidth и borderColor для button.layer и добавьте еще один подслой, который будет перекрывать вашу рамку.

Например:

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