有的时候我们想要view变成圆角,实现起来很简单:
rectView.layer.cornerRadius = 20.0f;
这样rectView的四个角都变成圆角了。但是有的时候我们并不想让四个角都变成圆角,我们只想要上面的两个角变成圆角,这个该怎么实现呢?
答案是我们创建一个CAShapeLayer并将其设置为rectView的mask,设置这个CAShapeLayer的path属性为一个UIBezierPath,在创建UIBeizierPath的时候设置我们想要变换的角。例子如下:
- (void)viewDidLoad
{
[super viewDidLoad];
[self addRectView];
}
- (void)addRectView
{
UIView *rectView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 100)];
rectView.center = self.view.center;
rectView.backgroundColor = [UIColor purpleColor];
UIRectCorner rectCorner = UIRectCornerTopLeft | UIRectCornerTopRight;
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rectView.bounds
byRoundingCorners:rectCorner
cornerRadii:CGSizeMake(20, 20)];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = path.CGPath;
rectView.layer.mask = shapeLayer;
[self.view addSubview:rectView];
}
效果如下:
注意:
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rectView.bounds
byRoundingCorners:rectCorner
cornerRadii:CGSizeMake(20, 20)];
如果把rectView.bounds,换成rectView.frame是不能达到这个效果的。
注意:
如果把
rectView.layer.mask = shapeLayer;
换成
[rectView.layer addSublayer:shapeLayer];
会是这样的效果:
也就是说当我们设置layer.mask属性(图层蒙版)的时候,会截去mask之外的部分。而只是addSublayer是没有这种效果的。
我理解mask属性,就像我们做饼干的时候,有一个小熊形状的模具(mask),原本有一个长方形的饼干(rectView.layer),把模具按在饼干上,最后得到的是一个小熊形状的饼干(rectView.layer.mask),而多余的部分则扔掉。
网友评论