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