– (
void
)tableView:(
UITableView
*)tableView willDisplayCell:(
UITableViewCell
*)cell forRowAtIndexPath:(
NSIndexPath
*)indexPath
{
//
圆角弧度半径
CGFloat
cornerRadius =
6.f
;
//
设置
cell
的背景色为透明,如果不设置这个的话,则原来的背景色不会被覆盖
cell.
backgroundColor
=
UIColor
.
clearColor
;
//
创建一个
shapeLayer
CAShapeLayer
*layer = [[
CAShapeLayer
alloc
]
init
];
CAShapeLayer
*backgroundLayer = [[
CAShapeLayer
alloc
]
init
];
//
显示选中
//
创建一个可变的图像
Path
句柄,该路径用于保存绘图信息
CGMutablePathRef
pathRef =
CGPathCreateMutable
();
//
获取
cell
的
size
//
第一个参数
,
是整个
cell
的
bounds,
第二个参数是距左右两端的距离
,
第三个参数是距上下两端的距离
CGRect
bounds =
CGRectInset
(cell.
bounds
,
10
,
0
);
// CGRectGetMinY
:返回对象顶点坐标
// CGRectGetMaxY
:返回对象底点坐标
// CGRectGetMinX
:返回对象左边缘坐标
// CGRectGetMaxX
:返回对象右边缘坐标
// CGRectGetMidX:
返回对象中心点的
X
坐标
// CGRectGetMidY:
返回对象中心点的
Y
坐标
//
这里要判断分组列表中的第一行,每组
section
的第一行,每组
section
的中间行
// CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius);
if
(indexPath.
row
==
0
) {
//
初始起点为
cell
的左下角坐标
CGPathMoveToPoint
(pathRef,
nil
,
CGRectGetMinX
(bounds),
CGRectGetMaxY
(bounds));
//
起始坐标为左下角,设为
p
,(
CGRectGetMinX(bounds), CGRectGetMinY(bounds)
)为左上角的点,设为
p1(x1,y1)
,
(CGRectGetMidX(bounds), CGRectGetMinY(bounds))
为顶部中点的点,设为
p2(x2,y2)
。然后连接
p1
和
p2
为一条直线
l1
,连接初始点
p
到
p1
成一条直线
l
,则在两条直线相交处绘制弧度为
r
的圆角。
CGPathAddArcToPoint
(pathRef,
nil
,
CGRectGetMinX
(bounds),
CGRectGetMinY
(bounds),
CGRectGetMidX
(bounds),
CGRectGetMinY
(bounds), cornerRadius);
CGPathAddArcToPoint
(pathRef,
nil
,
CGRectGetMaxX
(bounds),
CGRectGetMinY
(bounds),
CGRectGetMaxX
(bounds),
CGRectGetMidY
(bounds), cornerRadius);
//
终点坐标为右下角坐标点,把绘图信息都放到路径中去
,
根据这些路径就构成了一块区域了
CGPathAddLineToPoint
(pathRef,
nil
,
CGRectGetMaxX
(bounds),
CGRectGetMaxY
(bounds));
}
else
if
(indexPath.
row
== [tableView
numberOfRowsInSection
:indexPath.
section
]-
1
) {
//
初始起点为
cell
的左上角坐标
CGPathMoveToPoint
(pathRef,
nil
,
CGRectGetMinX
(bounds),
CGRectGetMinY
(bounds));
CGPathAddArcToPoint
(pathRef,
nil
,
CGRectGetMinX
(bounds),
CGRectGetMaxY
(bounds),
CGRectGetMidX
(bounds),
CGRectGetMaxY
(bounds), cornerRadius);
CGPathAddArcToPoint
(pathRef,
nil
,
CGRectGetMaxX
(bounds),
CGRectGetMaxY
(bounds),
CGRectGetMaxX
(bounds),
CGRectGetMidY
(bounds), cornerRadius);
//
添加一条直线,终点坐标为右下角坐标点并放到路径中去
CGPathAddLineToPoint
(pathRef,
nil
,
CGRectGetMaxX
(bounds),
CGRectGetMinY
(bounds));
}
else
{
//
添加
cell
的
rectangle
信息到
path
中(不包括圆角)
//
假如用填充色,用这个
// CGPathAddRect(pathRef, nil, bounds);
//
假如只要边框
CGPathMoveToPoint
(pathRef,
nil
,
CGRectGetMinX
(bounds),
CGRectGetMaxY
(bounds));
CGPathAddLineToPoint
(pathRef,
nil
,
CGRectGetMinX
(bounds),
CGRectGetMinY
(bounds));
CGPathMoveToPoint
(pathRef,
nil
,
CGRectGetMaxX
(bounds),
CGRectGetMinY
(bounds));
CGPathAddLineToPoint
(pathRef,
nil
,
CGRectGetMaxX
(bounds),
CGRectGetMaxY
(bounds));
}
//
把已经绘制好的可变图像路径赋值给图层,然后图层根据这图像
path
进行图像渲染
render
layer.
path
= pathRef;
backgroundLayer.
path
= pathRef;
//
注意:但凡通过
Quartz2D
中带有
creat/copy/retain
方法创建出来的值都必须要释放
CFRelease
(pathRef);
//
按照
shape layer
的
path
填充颜色,类似于渲染
render
// layer.fillColor = [UIColor colorWithWhite:1.f alpha:0.8f].CGColor;
layer.
strokeColor
= [
UIColor
blackColor
].
CGColor
;
layer.
fillColor
= [
UIColor
clearColor
].
CGColor
;
// view
大小与
cell
一致
UIView
*roundView = [[
UIView
alloc
]
initWithFrame
:bounds];
//
添加自定义圆角后的图层到
roundView
中
[roundView.
layer
insertSublayer
:layer
atIndex
:
0
];
roundView.
backgroundColor
=
UIColor
.
clearColor
;
// cell
的背景
view
cell.
backgroundView
= roundView;
//
以上方法存在缺陷当点击
cell
时还是出现
cell
方形效果,因此还需要添加以下方法
//
如果你
cell
已经取消选中状态的话
,
那以下方法是不需要的
.
UIView
*selectedBackgroundView = [[
UIView
alloc
]
initWithFrame
:bounds];
backgroundLayer.
fillColor
= [
UIColor
cyanColor
].
CGColor
;
[selectedBackgroundView.
layer
insertSublayer
:backgroundLayer
atIndex
:
0
];
selectedBackgroundView.
backgroundColor
=
UIColor
.
clearColor
;
cell.
selectedBackgroundView
= selectedBackgroundView;
}