'Round only 2 corners of a UIView in custom UITableViewCell - iOS

I have a UIView in a custom UITableViewCell and I want to round just bottom Left and Right corners of that view. I'm doing the following, but it's not working:

- (void)awakeFromNib {
    // Initialization code

    CAShapeLayer * maskLayer = [CAShapeLayer layer];
    maskLayer.path = [UIBezierPath bezierPathWithRoundedRect: _viewForTags.bounds byRoundingCorners: UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii: (CGSize){7.0, 7.0}].CGPath;

    _viewForTags.layer.mask = maskLayer;
}

I usually achieve this in usual View Controllers in the viewWillLayoutSubviews method and it works perfectly, but there's no such method when I subclass UITableViewCell.

Any idea how can I round 2 corners of a view in a subclassed UITableViewCell?



Solution 1:[1]

actually there is a method for that state in UITableViewCell. it is layoutSubviews

-(void)layoutSubviews
{
    CAShapeLayer * maskLayer = [CAShapeLayer layer];
    maskLayer.path = [UIBezierPath bezierPathWithRoundedRect: _im.bounds byRoundingCorners: UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii: (CGSize){7.0, 7.0}].CGPath;

    _im.layer.mask = maskLayer;
}

Solution 2:[2]

UITableViewDelgate's

tableView:willDisplayCell:forRowAtIndexPath:

method will be called overtime when cell is about to be displayed on the screen. You can have your code in this method.

Solution 3:[3]

The reason is that you put your code in wrong place. Method awakeFromNib is actually place where your views got initialized, and at this time _viewForTags.bounds gives you CGRectZero. You need to move your code into setSelected:animated: method, or give concrete CGRect value.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:_viewForTags.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:(CGSize){7.0, 7.0}].CGPath;
    _viewForTags.layer.mask = maskLayer;
}

Solution 4:[4]

Apply in cellforrowatindex

CAShapeLayer * maskLayer = [CAShapeLayer layer];
maskLayer.path = [UIBezierPath bezierPathWithRoundedRect: yourCustomCell.yourViewInCustomCell.bounds byRoundingCorners: UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii: (CGSize){7.0, 7.0}].CGPath;

yourCustomCell.yourViewInCustomCell.layer.mask = maskLayer;

Solution 5:[5]

This works with Swift 5 (and probably earlier):

    let maskLayer = CAShapeLayer()
    maskLayer.path = UIBezierPath(
                         roundedRect:       myView.bounds,
                         byRoundingCorners: [topLeft, .topRight],                             
                         cornerRadii:       CGSize(width:10.0, height:10.0)
                     ).cgPath
    myView.layer.mask = maskLayer

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 meth
Solution 2 Vishnu gondlekar
Solution 3 Shamsiddin Saidov
Solution 4 Hasya
Solution 5