Swift中UIView的圆顶角落

Abd*_*ich 4 uitabbarcontroller uitableview cashapelayer uibezierpath swift

我正在尝试使用下面的代码来绕顶角

func roundCorners(corners:UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: self.bounds,
                                byRoundingCorners: corners,
                                cornerRadii: CGSize(width: radius, height: radius))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        maskLayer.path = path.cgPath
        self.layer.mask = maskLayer
    }
Run Code Online (Sandbox Code Playgroud)

使用 myView.roundCorners(corners:[.topLeft, .topRight], radius: radius)

但它正在围绕观点的一边:
在此输入图像描述

这是在tableView sectionHeader中,如果我向下滚动然后使用相同的代码向上舍入: 在此输入图像描述

顶部折扣视角也使用相同的功能进行四舍五入.

感谢帮助.

更新 如果我修复视图上的宽度然后它工作正常.

Jos*_*osé 11

iOS 11引入了maskedCorners,可以获得更平滑,质量更好的结果.您仍然可以在函数调用中使用UIRectCorner并将其转换为CACornerMask:

Swift 4.2:

extension UIView {

    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
        if #available(iOS 11.0, *) {
            clipsToBounds = true
            layer.cornerRadius = radius
            layer.maskedCorners = CACornerMask(rawValue: corners.rawValue)
        } else {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            layer.mask = mask
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Abd*_*ich 5

在@Paolo的帮助下解决了这个问题,下面是工作代码。

斯威夫特3.2

extension UIView {

    func roundCorners(corners:UIRectCorner, radius: CGFloat) {

        DispatchQueue.main.async {
            let path = UIBezierPath(roundedRect: self.bounds,
                                    byRoundingCorners: corners,
                                    cornerRadii: CGSize(width: radius, height: radius))
            let maskLayer = CAShapeLayer()
            maskLayer.frame = self.bounds
            maskLayer.path = path.cgPath
            self.layer.mask = maskLayer
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要调用此函数,请在下面的行中使用,并提及要舍入的角

self.myView.roundCorners(corners: [.topLeft, .topRight, .bottomLeft, .bottomRight], radius: 8.0)
Run Code Online (Sandbox Code Playgroud)