'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 |