Bezierpath 按钮宽度问题

Posted

技术标签:

【中文标题】Bezierpath 按钮宽度问题【英文标题】:Bezierpath button width issue 【发布时间】:2017-12-26 03:45:21 【问题描述】:
func roundCorners(_ corners: UIRectCorner, radius: CGFloat) 
            let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
        

我正在使用此函数为UIButton 提供特定侧的圆角半径。我将此函数调用为UITableViewCell,但我遇到了像这样的问题. 但它没有改变,并且按钮正在从其宽度中切割。

我在TableviewCell调用这个函数

override func layoutSubviews() 
        super.layoutSubviews()
        self.btnWithdraw.roundCorners([.bottomRight], radius: 4.0)
        self.btnAddFund.roundCorners([.bottomLeft], radius: 4.0)

但是这里的问题就像它是按照情节提要视图控制器中给出的原始帧,而按钮没有按照约束的宽度。

任何帮助将不胜感激。 谢谢

【问题讨论】:

ios 9 中,按钮具有仅圆角的固有能力,无需遮罩。 好的,如果我的应用程序支持 ios 8,我该怎么办? @马特 把你的代码放在里面,drawReact 【参考方案1】:

也许问题在于您假设在重新布置 按钮 的所有情况下都会在 cell 上调用 layoutSubviews。这可能不是真的。

为避免这种假设,请按照以下方式在按钮本身中实现整个屏蔽:

class MyButton : UIButton 
    var whatCorners : UIRectCorner = [.bottomRight]
    var whatRadius : CGFloat = 4.0
    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) 
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    
    override func layoutSubviews() 
        super.layoutSubviews()
        self.roundCorners(self.whatCorners, radius: self.whatRadius)
    

这样,您可以为每个按钮指定 whatCornerswhatRadius 的所需值,然后按钮将自行圆整。

【讨论】:

以上是关于Bezierpath 按钮宽度问题的主要内容,如果未能解决你的问题,请参考以下文章

在 UIButton 中创建三角形

如何使用 BezierPath 绘制 1px 线

在 Tableview 中使用 BezierPath 创建时间线视图

为啥`[bezierPath closePath]`方法没有关闭我的路径?

如何在Swift中的BezierPath之后为imageView的点1到2和点2到3设置不同的animation.duration时间?

bezier曲线的一个计算问题