角落不是UILabel和UI按钮ios swift

时间:2017-08-26 12:46:05

标签: swift uitableview uibutton uilabel

我试图通过以下方式围绕标签和按钮的三个角: rounded button

但结果是:

Image of issue

标签的某些角落是圆形的,有些则不是。同样地,按钮和宽度的发生超出了按钮并且超出了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 {}

1 个答案:

答案 0 :(得分:1)

发生这种情况是因为当您调用bounds方法时以及在表格视图中显示这些标签时,rounded...()这些标签和按钮可能会有所不同。

这是因为用于创建bounds的{​​{1}}值与这些视图在单元格中显示后的值不同。表视图布局一个单元格,如果您创建的UIBezierPath超出其边界,它将被“切断”。

您应该创建CAShapeLayerUIButton的子类,每次布局时都会更新其掩码的贝塞尔路径。

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