角落不是UILabel和UIbutton ios swift的圆形

Posted

技术标签:

【中文标题】角落不是UILabel和UIbutton ios swift的圆形【英文标题】:Corner are not round of UILabel and UIbutton ios swift 【发布时间】:2017-08-26 12:46:04 【问题描述】:

我正在尝试通过以下方法使标签和按钮的三个角变圆: 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 

【问题讨论】:

ios 中制作圆角真的很容易。您只需要view.layer.cornerRadius = aFloat。无需子类化任何东西,它适用于UIView的所有子类 Rounded rect using UIRectCorner in Swift not working的可能重复 【参考方案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
    

【讨论】:

以上是关于角落不是UILabel和UIbutton ios swift的圆形的主要内容,如果未能解决你的问题,请参考以下文章

iOS:表格单元格中的 UILabel 和 UIButton

UILabel 和 UIButton - 截断标签而不是按钮

只需要修复 UIButton 和 UILabel 的自动布局问题

Swift:如何从另一个类 X 更新 UILabel:UIButton

iOS UITextView 或 UILabel 带有可点击的动作链接[重复]

使用 UILabel 和 UIButton 显示用户标签