Round Top Corners of a UIView in Swift

后端 未结 2 1344
死守一世寂寞
死守一世寂寞 2020-12-31 20:30

I am trying to round top corners using below code

func roundCorners(corners:UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: se         


        
相关标签:
2条回答
  • 2020-12-31 20:41

    Solved this with the help of @Paolo and below is the working code.

    Swift 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
            }
        }
    }
    

    for calling this function use below line and mention which corners you want to round

    self.myView.roundCorners(corners: [.topLeft, .topRight, .bottomLeft, .bottomRight], radius: 8.0)
    
    0 讨论(0)
  • 2020-12-31 20:45

    iOS 11 introduced maskedCorners which results in smoother and better quality results. You can still use the UIRectCorner in the function call and have it translated to CACornerMask:

    Swift 5.1:

    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
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题