给tableViewCell加圆角
http://www.jianshu.com/p/abd7738e146b
/** * 将要为每行row绘制cell,可自定义cell显示方法 cell 圆角*/
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if ([cell respondsToSelector:@selector(tintColor)]) {
        CGFloat cornerRadius = 4;
        if (tableView == self) {
            // 圆角弧度半径 CGFloat cornerRadius = 5.f;
            // 设置cell的背景色为透明,如果不设置这个的话,则原来的背景色不会被覆盖
            cell.backgroundColor = UIColor.clearColor; // UIColor.clearColor    [UIColor hdf_colorWithHexString:@"#f5f5f5"]
            // 创建一个shapeLayer
            CAShapeLayer *layer = [[CAShapeLayer alloc] init];
            // 创建一个可变的图像Path句柄,该路径用于保存绘图信息
            CGMutablePathRef pathRef = CGPathCreateMutable();
            // 获取cell的size
            CGRect cellBounds = CGRectMake(15, 0, cell.bounds.size.width - 30, cell.bounds.size.height);
            CGRect bounds = CGRectInset(cellBounds, 0, 0);
            // CGRectGetMinY:返回对象顶点坐标
            // CGRectGetMaxY:返回对象底点坐标
            // CGRectGetMinX:返回对象左边缘坐标
            // CGRectGetMaxX:返回对象右边缘坐标
            // 这里要判断分组列表中的第一行,每组section的最后一行,每组section的中间行
            BOOL addLine = NO;
            // CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius);
            if (indexPath.row == 0) {
                // 初始起点为cell的左下角坐标
                CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
                // 起始坐标为左下角,设为p1,(CGRectGetMinX(bounds), CGRectGetMinY(bounds))为左上角的点,设为p1(x1,y1),(CGRectGetMidX(bounds), CGRectGetMinY(bounds))为顶部中点的点,设为p2(x2,y2)。然后连接p1和p2为一条直线l1,连接初始点p到p1成一条直线l,则在两条直线相交处绘制弧度为r的圆角,并把左边直线和圆角路径添加到path中。
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds), CGRectGetMidX(bounds), CGRectGetMinY(bounds), cornerRadius);
                // 绘制右上角的圆角,包含顶端直线和右上角圆角并写入path中
                CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
                // 右边直线路径写入到path中,构成了一个左上角和右上角为圆角的矩形
                CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds));
                addLine = YES;
            } else if (indexPath.row == 2) {
//                // 初始起点为cell的左上角坐标 CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
//                // 左边直线和左下角圆角路径添加到path
//                CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds), CGRectGetMidX(bounds), CGRectGetMaxY(bounds), cornerRadius);
//                // 底边直线和右下角圆角路径添加到path
//                CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
//                // 右边直线添加到path,此时路径构成一个左下角和右下角为圆角的矩形 CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
                
                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 {
                // 中间行,直接添加rectangle信息到path中(不包括圆角)
                CGPathAddRect(pathRef, nil, bounds); addLine = YES;
            }
            // 把已经绘制好的可变图像路径赋值给图层
            layer.path = pathRef;
            // 注意:但凡通过Quartz2D中带有creat/copy/retain方法创建出来的值都必须要释放
            CFRelease(pathRef);
            // 按照shape layer的path填充颜色,类似于渲染render
            layer.fillColor = [UIColor hdf_colorWithHexString:@"#f5f5f5"].CGColor; // [UIColor colorWithWhite:1.f alpha:0.8f].CGColor
            // 添加分隔线图层
            if (addLine == YES) {
                CALayer *lineLayer = [[CALayer alloc] init];
                CGFloat lineHeight = (1.f / [UIScreen mainScreen].scale); 
                lineLayer.frame = CGRectMake(CGRectGetMinX(bounds) + 5, bounds.size.height-lineHeight, bounds.size.width - 10, lineHeight);
                // 分隔线颜色取自于原来tableview的分隔线颜色 
                lineLayer.backgroundColor = tableView.separatorColor.CGColor; 
                // 添加子图层 
                [layer addSublayer:lineLayer]; }  
            // view大小与cell一致 
            UIView *roundView = [[UIView alloc] initWithFrame:bounds]; 
            // 添加自定义圆角后的子图层到roundView中 
            [roundView.layer insertSublayer:layer atIndex:0];
            roundView.backgroundColor = [UIColor clearColor];
//            roundView.layer.backgroundColor = [UIColor hdf_colorWithHexString:@"#f5f5f5"].CGColor;
            //cell的背景view
            //cell.selectedBackgroundView = roundView; 
            cell.backgroundView = roundView;  
        } 
    }
}