#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
в общий вид
Комментарии:
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)
}