2017-08-26 49 views
0

我想按照这个圆标签和按钮的三个角: rounded button拐角不是圆形的UILabel和UIButton的IOS迅速

但结果是:

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 {} 
+0

在iOS中制作圆角很容易。所有你需要的是'view.layer.cornerRadius = aFloat'。没有必要继承任何东西,它适用于'UIView'的所有子类' –

+0

[在Rift中使用UIRectCorner的圆角矩形不能正常工作]的可能的重复(https://stackoverflow.com/questions/33050585/rounded-rect-using-u- directcorner在迅速不工作) –

回答

1

这些功能,这是因为这些标签和按钮的bounds是最有可能不同,当你调用rounded...()方法以及它们何时呈现在表格视图中。

这是因为用于创建UIBezierPathbounds值与这些视图在显示在单元中后的值不同。表视图布局一个单元格,如果你创建的CAShapeLayer超出了它的界限,它会被“切断”。

您应该创建一个UIButtonUILabel的子类,以便在每次布局时更新其掩码的贝塞尔路径。

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方法框架和路径。

class RoundedLabel: UILabel { 

    private lazy var maskLayer: CAShapeLayer = { 
     let maskLayer = CAShapeLayer() 
     maskLayer.cornerRadius = 5 
     maskLayer.masksToBounds = true 
     self.layer.mask = maskLayer 

     return maskLayer 
    }() 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     let maskPath = UIBezierPath(roundedRect: bounds, 
            byRoundingCorners: [.topRight, .bottomRight, .bottomLeft], 
            cornerRadii: CGSize(width: 10, height: 10)) 

     maskLayer.path = maskPath.cgPath 
     maskLayer.frame = bounds 
    } 
} 
+0

awsome,它的作品像一个魅力^ _ ^非常感谢。 –