1.方式一:
最常见设计圆角,绘制边框的方法是利用CALayer
的cornerRadius
和borderWidth
, borderColor
来实现:
self.view.layer.maskToBounds = YES;
self.view.layer.cornerRadius = 4.f;
self.view.layer.borderWidth = 2.f;
self.view.layer.borderColor = [UIColor redColor].CGColor;
这个实现方法里maskToBounds
会触发离屏渲染(offscreen rendering
),会导致app
的FPS
下降,特别是给UICollectionViewCell
设计圆角的时候,用户滑动浏览时,会觉得明显的卡顿,用户体验非常不好,所以在给多个view
设计圆角的时候不建议使用。
2.方式二:
直接上代码
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if ([cell isKindOfClass:[GXSectionCell class]]) {
CGFloat cellWidth = cell.width;
CGFloat cellHeight = cell.height;
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = CGRectMake(0, 0, cellWidth, cellHeight);
CAShapeLayer *borderLayer = [CAShapeLayer layer];
borderLayer.frame = CGRectMake(0, 0, cellWidth, cellHeight);
borderLayer.lineWidth = 1.f;
borderLayer.strokeColor = [UIColor colorWithHexString:@"D2D2D2"].CGColor;
borderLayer.fillColor = [UIColor clearColor].CGColor;
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(KNormalSpace, KNormalSpace/4, cellWidth - 2 * KNormalSpace, cellHeight - KNormalSpace/2) cornerRadius:5.0f];
maskLayer.path = bezierPath.CGPath;
borderLayer.path = bezierPath.CGPath;
[cell.contentView.layer insertSublayer:borderLayer atIndex:0];
[cell.layer setMask:maskLayer];
}
}
- 代码中创建了两个
CAShapeLayer
, 关于CAShapeLayer
先讲几句,CAShapeLayer
属于Core Animation
框架,会通过GPU
来渲染图形,节省性能,动画渲染直接交给手机GPU
,不消耗内存。CAShapeLayer
中shape
是形状的意思,需要形状才能生效,而贝塞尔曲线恰恰可以为CAShapeLayer
提供路径,CAShapeLayer
在提供的路径中进行渲染绘制出了shape
- 先看代码中创建的贝塞尔曲线,通过
UIBezierPath
的bezierPathWithRoundedRect:cornerRadius:
方法来绘制出一个带圆角矩形的路径,用来给CAShapeLayer
绘制图形 - 第一个layer叫做
maskLayer
,是用来给cell
实现遮罩效果,因为layer
使用的path
是一个圆角矩形的贝塞尔曲线,那么这个layer
形成的遮罩可以实现cell
的圆角。 - 第二个
layer
叫做borderLayer
,是用来绘制cell
边框颜色的,通过CAShapeLayer
的lineWidth
,strokeColor
来绘制边框,注意fillColor
一定要设置成clearColor
,否则会挡住整个cell
- 最后,将
borderLayer
加载到cell
的layer
上,将maskLayer
设置成cell layer
的mask
。
网友评论