1、需求
最近项目中遇到需要在tableview的cell中加入多个圆角的需求,用系统提供的clipsToBounds设置会导致离屏渲染,严重影响性能和客户体验。
2、解决方案
在每一View的layer层中有一个mask属性,他就是专门来设置该View的遮罩效果的。该mask本身也是一个layer层。我们只需要生成一个自定义的layer,然后覆盖在需要遮罩的View上面即可。问题就归于如何生成入上图所示的不规则图片的Layer。CAShapeLayer可以根据设置的条件,产生一个闭合空间的layer,这就是我们常说的贝塞尔曲线。
设置圆角我们采用的方法是:+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;
3、实现代码
实现方式为实现了CAShapeLayer+ViewMask的ViewMask的Category。
#import "CAShapeLayer+ViewMask.h"
@implementation CAShapeLayer (ViewMask)
+ (instancetype)createMaskLayerWithView:(UIView *)view withRoudCorner:(UIRectCorner)rectCorner withSizeRound:(CGSize)sizeRound{
CGFloat viewWidth = CGRectGetWidth(view.frame);
CGFloat viewHeight = CGRectGetHeight(view.frame);
UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, viewWidth, viewHeight) byRoundingCorners:rectCorner cornerRadii:sizeRound];
CAShapeLayer *layer = [CAShapeLayer layer];
layer.path = path.CGPath;
return layer;
}
@end
这个是我自定义的方法,可以通过rectCorner设置想要给view添加四个角中的哪几个角,sizeRound可以设置圆角的弧度。
写在此作为笔记,有什么不对的欢迎大家指正。