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

#ios #swift #uibezierpath #cashapelayer

#iOS #swift #uibezierpath #cashapelayer

Вопрос:

У меня есть 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))
}
  

но этот слой выглядит прозрачным, поэтому область кнопки видна, я хочу, чтобы поверх кнопки был непрозрачный слой. можно ли это сделать через layer или мне нужно добавить другой вид и поместить обе кнопки и это отдельное UIView в общий вид

кнопка со слоем ca

Комментарии:

1. Вы не показываете все соответствующие строки кода.

2. UIbutton находится в раскадровке, и, кроме этого, я добавил границу и ничего больше

Ответ №1:

Как я понимаю, вы установили 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)
    }