右上角和左上角半径无法正常工作

Posted

技术标签:

【中文标题】右上角和左上角半径无法正常工作【英文标题】:Top right and top left corner radius is not working properly 【发布时间】:2020-04-10 07:37:56 【问题描述】:

我只想为顶角添加圆角半径,当我将圆角半径添加到顶角时,整个视图的宽度都在变化,下面是我使用的代码。

func roundCorners(corners: UIRectCorner, radius: CGFloat) 
     let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
     let mask = CAShapeLayer()
     layer.mask = mask
     mask.path = path.cgPath
     layer.masksToBounds = true

当我为整个图层添加圆角半径时,它工作正常,

图层视图.layer.cornerRadius = 半径

但我只想要顶角半径如何在不影响视图宽度的情况下做到这一点

【问题讨论】:

我刚刚尝试了您的功能,它在标准UIButton 上运行良好,但您使用的按钮可能有问题?如果您包含相关的自定义按钮代码(它的布局是如何构建的)会有所帮助 【参考方案1】:

您可以使用以下函数来实现该行为

func roundCorners(_ corners: UIRectCorner, radius: CGFloat) 
        let maskPath = UIBezierPath(
            roundedRect: bounds,
            byRoundingCorners: corners,
            cornerRadii: CGSize(width: radius, height: radius))

        let shape = CAShapeLayer()
        shape.path = maskPath.cgPath
        layer.mask = shape
    

然后像这样简单地使用它

someview.roundCorners([.topLeft, .topRight], radius: 25)

但应用圆角半径的关键在于应用的时间!!您可以在 ViewDidAppear 或 layoutsubviews 方法中应用它。基本上在那些你确定你会得到视图的准确宽度和高度的地方。谢谢!!

【讨论】:

【参考方案2】:

使用这个扩展

extension UIView 


   @discardableResult func _round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer 
    let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
    let mask = CAShapeLayer()
    mask.path = path.cgPath
    self.layer.mask = mask
    return mask
   

func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) 
    let borderLayer = CAShapeLayer()
    borderLayer.path = mask.path
    borderLayer.fillColor = UIColor.clear.cgColor
    borderLayer.strokeColor = borderColor.cgColor
    borderLayer.lineWidth = borderWidth
    borderLayer.frame = bounds
    layer.addSublayer(borderLayer)


func round(corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) 
    let mask = _round(corners: corners, radius: radius)
    addBorder(mask: mask, borderColor: borderColor, borderWidth: borderWidth)


你可以通过下面的代码调用

 self.yourView.round(corners: [.topLeft,.topRight], radius: 20, borderColor: .clear, borderWidth: 0)

【讨论】:

以上是关于右上角和左上角半径无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

带圆角的可滚动表格

UIButton 圆角半径在 CustomClass 中无法正常工作

无法理解 CGPathAddArc

CSS3 PIE 在 IE8 中无法正常工作

Qt 5.3 QSystemTrayIcon 无法正常工作[Linux]

如何在Iphone +上仅将表格视图自定义单元格的左上角和右上角半径转角