Search code examples
swiftuitableviewuitabbarcontrolleruibezierpathcashapelayer

Round Top Corners of a UIView in Swift


I am trying to round top corners using below code

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
    }

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

But it's rounding one side of the view:
enter image description here

this is in a tableView sectionHeader if I scroll down then up it rounded using same code: enter image description here

And also top discount view corners are rounded using same function.

thank's for help.

Update if I fix the width on the view then it works fine.


Solution

  • 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)