圆角有不同的半径

时间:2018-06-11 12:20:18

标签: ios swift uibezierpath

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

        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发表评论,我会将圆角或底角四舍五入,但不会同时覆盖它们 谢谢

3 个答案:

答案 0 :(得分:0)

使用函数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
        }
}

答案 1 :(得分:0)

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

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

编辑:

通过一点点挖掘,我发现这篇文章包含了生成圆角矩形的代码,每个角落的角半径不同:

IOS: Is possible to rounder radius with different value in each corner

答案 2 :(得分:-1)

之后打电话

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

}