How to set cornerRadius for only top-left and top-right corner of a UIView? How to set cornerRadius for only top-left and top-right corner of a UIView? ios ios

How to set cornerRadius for only top-left and top-right corner of a UIView?


I am not sure why your solution did not work but the following code is working for me. Create a bezier mask and apply it to your view. In my code below I was rounding the bottom corners of the _backgroundView with a radius of 3 pixels. self is a custom UITableViewCell:

UIBezierPath *maskPath = [UIBezierPath    bezierPathWithRoundedRect:self.backgroundImageView.bounds    byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight)    cornerRadii:CGSizeMake(20, 20)];CAShapeLayer *maskLayer = [CAShapeLayer layer];maskLayer.frame = self.bounds;maskLayer.path = maskPath.CGPath;self.backgroundImageView.layer.mask = maskLayer;

Swift version with some improvements:

let path = UIBezierPath(roundedRect:viewToRound.bounds, byRoundingCorners:[.TopRight, .BottomLeft], cornerRadii: CGSizeMake(20, 20))let maskLayer = CAShapeLayer()maskLayer.path = path.CGPathviewToRound.layer.mask = maskLayer

Swift 3.0 version:

let path = UIBezierPath(roundedRect:viewToRound.bounds,                        byRoundingCorners:[.topRight, .bottomLeft],                        cornerRadii: CGSize(width: 20, height:  20))let maskLayer = CAShapeLayer()maskLayer.path = path.cgPathviewToRound.layer.mask = maskLayer

Swift extension here


Pay attention to the fact that if you have layout constraints attached to it, you must refresh this as follows in your UIView subclass:

override func layoutSubviews() {    super.layoutSubviews()    roundCorners(corners: [.topLeft, .topRight], radius: 3.0)}

If you don't do that it won't show up.


And to round corners, use the extension:

extension UIView {   func roundCorners(corners: UIRectCorner, radius: CGFloat) {        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))        let mask = CAShapeLayer()        mask.path = path.cgPath        layer.mask = mask    }}


Additional view controller case: Whether you can't or wouldn't want to subclass a view, you can still round a view. Do it from its view controller by overriding the viewWillLayoutSubviews() function, as follows:

class MyVC: UIViewController {    /// The view to round the top-left and top-right hand corners    let theView: UIView = {        let v = UIView(frame: CGRect(x: 10, y: 10, width: 200, height: 200))        v.backgroundColor = .red        return v    }()        override func loadView() {        super.loadView()        view.addSubview(theView)    }        override func viewWillLayoutSubviews() {        super.viewWillLayoutSubviews()        // Call the roundCorners() func right there.        theView.roundCorners(corners: [.topLeft, .topRight], radius: 30)    }}


And finally… there is CACornerMask in iOS11!With CACornerMask it can be done pretty easy:

let view = UIView()view.clipsToBounds = trueview.layer.cornerRadius = 10view.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] // Top right corner, Top left corner respectively