不同半径的圆角

Round corners with different radius

我需要用任意值对视图的顶角进行圆角处理,并用不同的值对同一视图的底角进行圆角处理。在这里,我有我认为可以解决这个问题的代码。但它不起作用...知道吗?

        bottomPath = UIBezierPath(roundedRect:self.bounds,
                               byRoundingCorners:[.bottomLeft, .bottomRight],
                               cornerRadii: CGSize(width: radius, height:  radius))
        topPath = UIBezierPath(roundedRect:self.bounds,
                               byRoundingCorners:[.topLeft, .topRight],
                               cornerRadii: CGSize(width: radius, height:  radius))

        bottomPath.append(topPath)
        maskLayer = CAShapeLayer()
        maskLayer?.path = bottomPath.cgPath
        self.layer.mask = maskLayer

如果我评论 bottomPath 或 topPath,我会得到圆顶角或底角,但不会同时圆角 谢谢

之后打电话

override func layoutSubviews() {
//here call round func 
self.layoutIfNeeded()
super.layoutSubviews()

}

使用函数 viewDidLayoutSubviews 并在里面调用你的函数,来改变圆角。

示例:

override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        headerView.roundedButtonForTopRightTopLeft()
        view.setNeedsLayout()
        view.setNeedsDisplay()
    }
    extension UIView {
        func roundedButtonForTopRightTopLeft(){
            let maskPath1 = UIBezierPath(roundedRect: bounds,
                                         byRoundingCorners: [.topRight , .topLeft],
                                         cornerRadii: CGSize(width: 8, height: 8))
            let maskLayer1 = CAShapeLayer()
            maskLayer1.frame = bounds
            maskLayer1.path = maskPath1.cgPath
            layer.mask = maskLayer1
        }
}

我不相信有任何系统调用可以为每个角创建一个具有不同角半径的圆角矩形。您正在使用的函数 UIBezierPath(roundedRect:byRoundingCorners:cornerRadii:) 将创建一个圆角矩形,其中一些角是圆的,一些不是,但是您要求圆化的角都具有相同的半径。

如果你想创建一条路径,不同的角圆角成不同的半径,我很确定你必须自己构建这样的路径,每个角使用圆弧,圆角矩形的平坦边使用线段. (你会画一条闭合路径,它由角度为 π/2 的圆弧组成,然后是一条线段,然后重复 4 次。每个圆弧的中心将是矩形的那个角,由圆角半径插入两个维度。这有助于在方格纸上绘制图表。)

编辑:

经过一些挖掘,我发现这个 post 包含用于生成每个角具有不同角半径的圆角矩形的代码: