我试图通过以下方式围绕标签和按钮的三个角: rounded button
但结果是:
标签的某些角落是圆形的,有些则不是。同样地,按钮和宽度的发生超出了按钮并且超出了tableview。
这是我正在使用的扩展代码:
extension UIButton{
func roundedButton(){
let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: [.topLeft, .bottomLeft, .bottomRight],
cornerRadii:CGSize(width:8,height:8))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = self.bounds
maskLayer1.masksToBounds=true
maskLayer1.path = maskPAth1.cgPath
self.layer.mask = maskLayer1
}
}
extension UILabel{
func roundedLabel(){
let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: [.topRight,.bottomRight,.bottomLeft],
cornerRadii:CGSize(width:10,height:10))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = self.bounds
maskLayer1.cornerRadius=5
maskLayer1.masksToBounds=true
maskLayer1.path = maskPAth1.cgPath
self.layer.mask = maskLayer1
}
}
我在
中调用这些功能func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
答案 0 :(得分:1)
发生这种情况是因为当您调用bounds
方法时以及在表格视图中显示这些标签时,rounded...()
这些标签和按钮可能会有所不同。
这是因为用于创建bounds
的{{1}}值与这些视图在单元格中显示后的值不同。表视图布局一个单元格,如果您创建的UIBezierPath
超出其边界,它将被“切断”。
您应该创建CAShapeLayer
和UIButton
的子类,每次布局时都会更新其掩码的贝塞尔路径。
UILabel
作为进一步的优化,您可以懒惰地初始化遮罩层(意味着它将在第一次访问时创建)并且仅在class RoundedLabel: UILabel {
override func layoutSubviews() {
super.layoutSubviews()
let maskPath = UIBezierPath(roundedRect: bounds,
byRoundingCorners: [.topRight, .bottomRight, .bottomLeft],
cornerRadii: CGSize(width: 10, height: 10))
let maskLayer = CAShapeLayer()
maskLayer.frame = bounds
maskLayer.cornerRadius = 5
maskLayer.masksToBounds = true
maskLayer.path = maskPath.cgPath
layer.mask = maskLayer
}
}
方法中更改它的框架和路径。
layoutSubviews