在自定义 UITableViewCell 中仅圆化 UIView 的 2 个角 - iOS
Round only 2 corners of a UIView in custom UITableViewCell - iOS
我在自定义 UITableViewCell
中有一个 UIView
,我想只圆化该视图的左下角和右下角。我正在执行以下操作,但它不起作用:
- (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;
}
我通常在 viewWillLayoutSubviews
方法中在通常的视图控制器中实现这一点并且它完美地工作,但是当我子类化 UITableViewCell
.
时没有这样的方法
知道如何在子类 UITableViewCell
中圆化视图的 2 个角吗?
UITableViewDelegate
tableView:willDisplayCell:forRowAtIndexPath:
方法将在单元格即将显示在屏幕上时超时调用。你可以在这个方法中有你的代码。
在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;
原因是你把代码放错地方了。方法 awakeFromNib
实际上是你的视图被初始化的地方,此时 _viewForTags.bounds
给你 CGRectZero
。您需要将代码移动到 setSelected:animated:
方法中,或者给出具体的 CGRect
值。
- (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;
}
实际上 UITableViewCell
中有一个针对该状态的方法。这是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;
}
这适用于 Swift 5(可能更早):
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
我在自定义 UITableViewCell
中有一个 UIView
,我想只圆化该视图的左下角和右下角。我正在执行以下操作,但它不起作用:
- (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;
}
我通常在 viewWillLayoutSubviews
方法中在通常的视图控制器中实现这一点并且它完美地工作,但是当我子类化 UITableViewCell
.
知道如何在子类 UITableViewCell
中圆化视图的 2 个角吗?
UITableViewDelegate
tableView:willDisplayCell:forRowAtIndexPath:
方法将在单元格即将显示在屏幕上时超时调用。你可以在这个方法中有你的代码。
在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;
原因是你把代码放错地方了。方法 awakeFromNib
实际上是你的视图被初始化的地方,此时 _viewForTags.bounds
给你 CGRectZero
。您需要将代码移动到 setSelected:animated:
方法中,或者给出具体的 CGRect
值。
- (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;
}
实际上 UITableViewCell
中有一个针对该状态的方法。这是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;
}
这适用于 Swift 5(可能更早):
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