iOS开发技巧

【ios开发】UITableView分区且包含区头,设置圆角

2019-10-16  本文已影响0人  我是孙小白

写到一个需求,一个TableView进行了分区设置, 且每个区都是圆角显示。

那如何对section进行圆角设置呢?

UITableView的代理里有一个方法:- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

在cell即将被创建出来的时候, 我们进行cell边框的重绘:
通过UIBezierPathUIRectCorner指定需要成为圆角的角,画一个CAShapeLayer,将这个layer添加到cell.layer

若某一个section有区头, 则要对该区的第一个cell进行判断:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat cornerRadius =10.0;
    CGRect bounds = cell.bounds;

    // 每区行数
    NSInteger numberOfRows = [tableView numberOfRowsInSection:indexPath.section];
    // 区头
    UIView *view = [self tableView:tableView viewForHeaderInSection:indexPath.section];
   
    //绘制曲线
    UIBezierPath *bezierPath = nil;
    
    if (indexPath.row == 0 && numberOfRows == 1) {
        // 一个区只有一行cell
        if (view != nil) {
            // 有区头:左下,右下为圆角
            bezierPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:(UIRectCornerBottomLeft|UIRectCornerBottomRight) cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
        }else{
            //四个角都为圆角
            bezierPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
        }
    } else if (indexPath.row == 0) {
        // 某个区的第一行
        if (view != nil) {
            // 有区头:为矩形
            bezierPath = [UIBezierPath bezierPathWithRect:bounds];
        }else{
            //左上、右上角为圆角
            bezierPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
        }
    } else if (indexPath.row == numberOfRows - 1) {
        //某个区的最后一行:左下、右下角为圆角
        bezierPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:(UIRectCornerBottomLeft|UIRectCornerBottomRight) cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
    } else {
        //某个区的中间行:为矩形
        bezierPath = [UIBezierPath bezierPathWithRect:bounds];
    }

   cell.backgroundColor = [UIColor clearColor];
    
    //新建一个layer层,设置填充色和边框颜色
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.path = bezierPath.CGPath;
    layer.fillColor = [UIColor whiteColor].CGColor;
    layer.strokeColor = [UIColor whiteColor].CGColor;
    
    //将layer层添加到cell.layer中,并插到最底层
    [cell.layer insertSublayer:layer atIndex:0];
}

效果如图:

image.png

以上。
如帮你解决了问题,可以点赞支持我哦~

上一篇下一篇

猜你喜欢

热点阅读