使用 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
设置了 borderWidth
和 borderColor
。
此 button.layer
承载您添加到其中的所有其他子图层,这就是为什么您的边框始终位于顶部的原因。
因此您可以使用附加视图来绘制圆或...
只需为 button.layer
删除设置 borderWidth
和 borderColor
并添加另一个将覆盖边界的子图层。
例如:
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)
}
我有一个 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
设置了 borderWidth
和 borderColor
。
此 button.layer
承载您添加到其中的所有其他子图层,这就是为什么您的边框始终位于顶部的原因。
因此您可以使用附加视图来绘制圆或...
只需为 button.layer
删除设置 borderWidth
和 borderColor
并添加另一个将覆盖边界的子图层。
例如:
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)
}