【问题标题】:Border around UITableView SectionUITableView 部分周围的边框
【发布时间】:2013-08-07 09:31:24
【问题描述】:

我们如何在 tableview 的每个部分周围设置边框?附件是显示我正在寻找的图像。如果您查看图像,它的每个 tableview 部分周围都有一个边框。

【问题讨论】:

  • @HinataHyuga - 我已经检查过了 - 它把边框放在整个桌子上,而不是每个部分。
  • @itsaboutcode 你找到解决办法了吗

标签: ios objective-c uitableview


【解决方案1】:

对于这个问题,我对 jvanmetre 的答案进行了修改,用于圆桌视图的角,只需添加带有以下代码的 tableView:willDisplayCell:forRowAtIndexPath: 委托方法(一个简单的复制/粘贴应该可以工作),它也应该适用于分组表。我评论了你应该在哪里设置边框的宽度和颜色。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {

    if ([cell respondsToSelector:@selector(tintColor)]) {
        CGFloat cornerRadius = 5.f;
        cell.backgroundColor = UIColor.clearColor;
        CAShapeLayer *layer = [[CAShapeLayer alloc] init];
        CGMutablePathRef pathRef = CGPathCreateMutable();
        CGRect bounds = CGRectInset(cell.bounds, 10, 0);
        BOOL addLine = NO;
        if (indexPath.row == 0 && indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
            CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius);
        } else if (indexPath.row == 0) {
            CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
            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));
            addLine = YES;
        } else if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
            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 {
            CGPathAddRect(pathRef, nil, bounds);
            addLine = YES;
        }
        layer.path = pathRef;
        CFRelease(pathRef);
        //set the border color
        layer.strokeColor = [UIColor lightGrayColor].CGColor;
        //set the border width
        layer.lineWidth = 1;
        layer.fillColor = [UIColor colorWithWhite:1.f alpha:1.0f].CGColor;


        if (addLine == YES) {
            CALayer *lineLayer = [[CALayer alloc] init];
            CGFloat lineHeight = (1.f / [UIScreen mainScreen].scale);
            lineLayer.frame = CGRectMake(CGRectGetMinX(bounds), bounds.size.height-lineHeight, bounds.size.width, lineHeight);
            lineLayer.backgroundColor = tableView.separatorColor.CGColor;
            [layer addSublayer:lineLayer];
        }

        UIView *testView = [[UIView alloc] initWithFrame:bounds];
        [testView.layer insertSublayer:layer atIndex:0];
        testView.backgroundColor = UIColor.clearColor;
        cell.backgroundView = testView;
    }
}

另外,请记住在 Interface Builder 中将表格的 separator 属性设置为 none,(默认为单行),如果您以编程方式创建表格,则应该像这样设置属性

yourTableView.separatorStyle = UITableViewCellSeparatorStyleNone

【讨论】:

  • 这很好!如果您正在寻找更改背景颜色,请将 layer.fillColor 更改为所需的任何颜色。
  • 这不会覆盖headerView
  • 行数超过 2 行时不起作用:问题出在最后一个 else 语句中 - 它生成了一个矩形 -> 4 条边界线
  • 如果我在边框上加了阴影,那么每个单元格后面都会出现一个分隔符,如何消除呢?
  • 我怎样才能给影子。谁能帮帮我。
【解决方案2】:

这是已接受答案的快速版本。

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if (cell.respondsToSelector("tintColor")) {
        var cornerRadius: CGFloat = 5;
        cell.backgroundColor = UIColor.clearColor()
        var layer: CAShapeLayer  = CAShapeLayer()
        var pathRef: CGMutablePathRef  = CGPathCreateMutable()
        var bounds: CGRect  = CGRectInset(cell.bounds, 10, 0)
        var addLine: Bool  = false
        if (indexPath.row == 0 && indexPath.row == tableView.numberOfRowsInSection(indexPath.section)-1) {
            CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius);
        } else if (indexPath.row == 0) {
            CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
            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));
            addLine = true;
        } else if (indexPath.row == tableView.numberOfRowsInSection(indexPath.section)-1) {
            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 {
            CGPathAddRect(pathRef, nil, bounds);
            addLine = true;
        }
        layer.path = pathRef;
        //CFRelease(pathRef);
        //set the border color
        layer.strokeColor = UIColor.lightGrayColor().CGColor;
        //set the border width
        layer.lineWidth = 1;
        layer.fillColor = UIColor(white: 1, alpha: 1.0).CGColor;


        if (addLine == true) {
            var lineLayer: CALayer = CALayer();
            var lineHeight: CGFloat  = (1 / UIScreen.mainScreen().scale);
            lineLayer.frame = CGRectMake(CGRectGetMinX(bounds), bounds.size.height-lineHeight, bounds.size.width, lineHeight);
            lineLayer.backgroundColor = tableView.separatorColor!.CGColor;
            layer.addSublayer(lineLayer);
        }

        var testView: UIView = UIView(frame:bounds)
        testView.layer.insertSublayer(layer, atIndex: 0)
        testView.backgroundColor = UIColor.clearColor()
        cell.backgroundView = testView
    }

}

【讨论】:

  • 行数超过 2 行时不起作用:问题出在最后一个 else 语句中 - 它生成了一个矩形 -> 4 条边界线
  • 我怎样才能给影子。谁能帮帮我。
【解决方案3】:

这是我最终采用的另一种方法,可能会对某人有所帮助。它使用预定义的颜色和宽度为每个部分绘制边框,而不会更改单元格的其他属性。它不会给你一个圆形的部分(可能可以相应地修改),但它可以很好地控制要绘制的线条。该方法还解决了设备轮换问题。

typedef enum CellBorderMask{
    CellBorderMaskLeft      = 1 << 0,
    CellBorderMaskRigth     = 1 << 1,
    CellBorderMaskTop       = 1 << 2,
    CellBorderMaskBottom    = 1 << 3
}CellBorderMask;




- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    CellBorderMask mask;
    if (indexPath.row == 0){
        mask |= CellBorderMaskTop;
    }

    if(indexPath.row == [tableView numberOfRowsInSection:indexPath.section] - 1) {
        mask |= CellBorderMaskBottom;
    }
    mask |= CellBorderMaskRigth | CellBorderMaskLeft;
    [self addBorder:mask forView:cell.contentView];
}

-(void)addBorder:(CellBorderMask)mask forView:(UIView *)view{
    float onePixel = (1.f / [UIScreen mainScreen].scale);
    float lineWidth = 1 * onePixel;
    CGColorRef cgBorderColor = [UIColor redColor].CGColor;


    CALayer *topBorder = [CALayer layer];
    CALayer *bottomBorder = [CALayer layer];
    CALayer *leftBorder = [CALayer layer];
    CALayer *rightBorder = [CALayer layer];

    //tag layers so it's possible to find and remove them later 
    topBorder.name = @"Border";
    bottomBorder.name = @"Border";
    leftBorder.name = @"Border";
    rightBorder.name = @"Border";

    //remove previously set border layers so they doesn't produce unwanted effect on orientation change
    [self cleanUpOldBorderLayers:view];

    topBorder.frame = CGRectMake(0.0f, 0.0f, view.bounds.size.width, lineWidth);
    topBorder.backgroundColor = cgBorderColor;

    bottomBorder.frame = CGRectMake(0.0f, view.bounds.size.height - lineWidth, view.bounds.size.width, lineWidth);
    bottomBorder.backgroundColor = cgBorderColor;

    leftBorder.frame = CGRectMake(0.0f, 0.0f, lineWidth, view.bounds.size.height);
    leftBorder.backgroundColor = cgBorderColor;

    rightBorder.frame = CGRectMake(view.bounds.size.width - lineWidth, 0.0f, lineWidth, view.bounds.size.height);
    rightBorder.backgroundColor = cgBorderColor;
    if(mask & CellBorderMaskTop){
        [view.layer addSublayer:topBorder];
    }
    if(mask & CellBorderMaskBottom){
        [view.layer addSublayer:bottomBorder];
    }
    if(mask & CellBorderMaskLeft){
        [view.layer addSublayer:leftBorder];
    }
    if(mask & CellBorderMaskRigth){
        [view.layer addSublayer:rightBorder];
    }
}

-(void)cleanUpOldBorderLayers:(UIView *)view{
    NSMutableArray *layerArray = [NSMutableArray new];
    for (CALayer *layer in view.layer.sublayers) {
        if([@"Border" isEqualToString:layer.name]){
            [layerArray addObject:layer];
        }
    }
    for (CALayer *layer in layerArray) {
        [layer removeFromSuperlayer];
    }
}


-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    //need to trigger tableView:willDisplayCell: method on orientation change. 
    //Suggest a better method for this if there is one
    [self.tableView reloadData];
}

我使用 tableView 的 reloadData 方法重绘单元格,我认为这不是最好的方法。请就 cmets 中的替代方法提出建议,我将更新代码。

要为页眉/页脚添加边框,只需在 viewForHeaderInSection/viewForFooterInSection 委托方法中创建一个自定义视图,然后将视图传递给上面的 addBorder:forView 方法,然后再从您的委托返回。

【讨论】:

    【解决方案4】:

    这是 Asad 更新为 swift 3 的答案

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if (cell.responds(to: #selector(getter: UIView.tintColor))) {
            let cornerRadius: CGFloat = 5
            cell.backgroundColor = UIColor.clear
            let layer: CAShapeLayer  = CAShapeLayer()
            let pathRef: CGMutablePath  = CGMutablePath()
            let bounds: CGRect  = cell.bounds.insetBy(dx: 10, dy: 0)
            var addLine: Bool  = false
            if (indexPath.row == 0 && indexPath.row == tableView.numberOfRows(inSection: indexPath.section)-1) {
                pathRef.__addRoundedRect(transform: nil, rect: bounds, cornerWidth: cornerRadius, cornerHeight: cornerRadius)
            } else if (indexPath.row == 0) {
                pathRef.move(to: CGPoint(x:bounds.minX,y:bounds.maxY))
                pathRef.addArc(tangent1End: CGPoint(x:bounds.minX,y:bounds.minY), tangent2End: CGPoint(x:bounds.midX,y:bounds.minY), radius: cornerRadius)
    
                pathRef.addArc(tangent1End: CGPoint(x:bounds.maxX,y:bounds.minY), tangent2End: CGPoint(x:bounds.maxX,y:bounds.midY), radius: cornerRadius)
                pathRef.addLine(to: CGPoint(x:bounds.maxX,y:bounds.maxY))
                addLine = true;
            } else if (indexPath.row == tableView.numberOfRows(inSection: indexPath.section)-1) {
    
                pathRef.move(to: CGPoint(x:bounds.minX,y:bounds.minY))
                pathRef.addArc(tangent1End: CGPoint(x:bounds.minX,y:bounds.maxY), tangent2End: CGPoint(x:bounds.midX,y:bounds.maxY), radius: cornerRadius)
    
                pathRef.addArc(tangent1End: CGPoint(x:bounds.maxX,y:bounds.maxY), tangent2End: CGPoint(x:bounds.maxX,y:bounds.midY), radius: cornerRadius)
                pathRef.addLine(to: CGPoint(x:bounds.maxX,y:bounds.minY))
    
            } else {
                pathRef.addRect(bounds)
                addLine = true
            }
            layer.path = pathRef
            //CFRelease(pathRef)
            //set the border color
            layer.strokeColor = UIColor.lightGray.cgColor;
            //set the border width
            layer.lineWidth = 1
            layer.fillColor = UIColor(white: 1, alpha: 1.0).cgColor
    
    
            if (addLine == true) {
                let lineLayer: CALayer = CALayer()
                let lineHeight: CGFloat  = (1 / UIScreen.main.scale)
                lineLayer.frame = CGRect(x:bounds.minX, y:bounds.size.height-lineHeight, width:bounds.size.width, height:lineHeight)
                lineLayer.backgroundColor = tableView.separatorColor!.cgColor
                layer.addSublayer(lineLayer)
            }
    
            let testView: UIView = UIView(frame:bounds)
            testView.layer.insertSublayer(layer, at: 0)
            testView.backgroundColor = UIColor.clear
            cell.backgroundView = testView
        }
    
    }
    

    【讨论】:

    • 行数超过 2 行时不起作用:问题出在最后一个 else 语句中 - 它生成一个矩形 -> 4 条边界线
    • 我怎样才能给影子。谁能帮帮我。
    【解决方案5】:

    这是答案的 Swift3 版本:

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        let cornerRadius: CGFloat = 0.0
        cell.backgroundColor = UIColor.clear
        let layer: CAShapeLayer = CAShapeLayer()
        let pathRef: CGMutablePath = CGMutablePath()
        let bounds: CGRect = cell.bounds.insetBy(dx: 10, dy: 0)
        var addLine: Bool = false
    
        if indexPath.row == 0 && indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
            pathRef.__addRoundedRect(transform: nil, rect: bounds, cornerWidth: cornerRadius, cornerHeight: cornerRadius)
        } else if indexPath.row == 0 {
            pathRef.move(to: CGPoint(x: bounds.minX, y: bounds.maxY))
            pathRef.addArc(tangent1End: CGPoint(x: bounds.minX, y: bounds.minY), tangent2End: CGPoint(x: bounds.midX, y: bounds.minY), radius: cornerRadius)
            pathRef.addArc(tangent1End: CGPoint(x: bounds.maxX, y: bounds.minY), tangent2End: CGPoint(x: bounds.maxX, y: bounds.midY), radius: cornerRadius)
            pathRef.addLine(to: CGPoint(x: bounds.maxX, y: bounds.maxY))
            addLine = true
        } else if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
            pathRef.move(to: CGPoint(x: bounds.minX, y: bounds.minY))
            pathRef.addArc(tangent1End: CGPoint(x: bounds.minX, y: bounds.maxY), tangent2End: CGPoint(x: bounds.midX, y: bounds.maxY), radius: cornerRadius)
            pathRef.addArc(tangent1End: CGPoint(x: bounds.maxX, y: bounds.maxY), tangent2End: CGPoint(x: bounds.maxX, y: bounds.midY), radius: cornerRadius)
            pathRef.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
        } else {
            pathRef.addRect(bounds)
            addLine = true
        }
    
        layer.path = pathRef
        layer.strokeColor = UIColor.black.cgColor
        layer.lineWidth = 0.5
        layer.fillColor = UIColor(white: 1, alpha: 1.0).cgColor
    
        if addLine == true {
            let lineLayer: CALayer = CALayer()
            let lineHeight: CGFloat = (1 / UIScreen.main.scale)
            lineLayer.frame = CGRect(x: bounds.minX, y: bounds.size.height - lineHeight, width: bounds.size.width, height: lineHeight)
            lineLayer.backgroundColor = tableView.separatorColor!.cgColor
            layer.addSublayer(lineLayer)
        }
    
        let backgroundView: UIView = UIView(frame: bounds)
        backgroundView.layer.insertSublayer(layer, at: 0)
        backgroundView.backgroundColor = UIColor.clear
        cell.backgroundView = backgroundView
    }
    

    【讨论】:

      【解决方案6】:

      我修改了上面发布的代码,现在这段代码为部分创建了边框。 在swift4.2中测试

      func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
              let cornerRadius: CGFloat = 24
              cell.backgroundColor = .clear
      
              let layer = CAShapeLayer()
              let pathRef = CGMutablePath()
              let bounds = cell.bounds.insetBy(dx: 10, dy: 0)
              var addLine = false
      
              if indexPath.row == 0 && indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
                  pathRef.__addRoundedRect(transform: nil, rect: bounds, cornerWidth: cornerRadius, cornerHeight: cornerRadius)
              } else if indexPath.row == 0 {
                  pathRef.move(to: .init(x: bounds.minX, y: bounds.maxY))
                  pathRef.addArc(tangent1End: .init(x: bounds.minX, y: bounds.minY), tangent2End: .init(x: bounds.midX, y: bounds.minY), radius: cornerRadius)
                  pathRef.addArc(tangent1End: .init(x: bounds.maxX, y: bounds.minY), tangent2End: .init(x: bounds.maxX, y: bounds.midY), radius: cornerRadius)
                  pathRef.addLine(to: .init(x: bounds.maxX, y: bounds.maxY))
                  addLine = true
              } else if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
                  pathRef.move(to: .init(x: bounds.minX, y: bounds.minY))
                  pathRef.addArc(tangent1End: .init(x: bounds.minX, y: bounds.maxY), tangent2End: .init(x: bounds.midX, y: bounds.maxY), radius: cornerRadius)
                  pathRef.addArc(tangent1End: .init(x: bounds.maxX, y: bounds.maxY), tangent2End: .init(x: bounds.maxX, y: bounds.midY), radius: cornerRadius)
                  pathRef.addLine(to: .init(x: bounds.maxX, y: bounds.minY))
              } else {
                 //pathRef.addRect(bounds)
      
                  let pathInnerRef = CGMutablePath()
                  pathInnerRef.move(to: .init(x: bounds.minX, y: bounds.minY))
                  pathInnerRef.addLine(to: .init(x: bounds.minX, y: bounds.maxY))
      
                  pathInnerRef.move(to: .init(x: bounds.maxX, y: bounds.minY))
                  pathInnerRef.addLine(to: .init(x: bounds.maxX, y: bounds.maxY))
                  pathRef.addPath(pathInnerRef)
                  addLine = true
              }
      
              layer.path = pathRef
              layer.fillColor = UIColor.clear.cgColor
              layer.strokeColor = UIColor.black.cgColor
      
      
              if (addLine == true) {
                  let lineLayer = CALayer()
                  let lineHeight = 1.0 / UIScreen.main.scale
                  lineLayer.frame = CGRect(x: bounds.minX + 10, y: bounds.size.height - lineHeight, width: bounds.size.width - 10, height: lineHeight)
                  lineLayer.backgroundColor = UIColor.clear.cgColor//tableView.separatorColor?.cgColor
                  lineLayer.addBorder(edge: .left, color: UIColor.black, thickness: 2.0)
                  lineLayer.addBorder(edge: .right, color: UIColor.black, thickness: 2.0)
                  layer.addSublayer(lineLayer)
              }
      
      
              let testView = UIView(frame: bounds)
              testView.layer.insertSublayer(layer, at: 0)
              testView.backgroundColor = .clear
      
              cell.backgroundView = testView   
      }
      

      【讨论】:

      • 如果该部分有标题,则该解决方案不起作用。
      • 如何为这张卡添加阴影。如果我应用顶部和底部不会因为“dy:0”而出现
      【解决方案7】:

      针对不同部分中不同行数的有效修复

      func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
                  let cornerRadius: CGFloat = 0.0
                  cell.backgroundColor = UIColor.clear
                  let layer: CAShapeLayer = CAShapeLayer()
                  let pathRef: CGMutablePath = CGMutablePath()
                  //dx leading an trailing margins
                  let bounds: CGRect = cell.bounds.insetBy(dx: 8, dy: 0)
                  var addLine: Bool = false
      
                  if indexPath.row == 0 && indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
                      pathRef.__addRoundedRect(transform: nil, rect: bounds, cornerWidth: cornerRadius, cornerHeight: cornerRadius)
                  } else if indexPath.row == 0 {
                      pathRef.move(to: CGPoint(x: bounds.minX, y: bounds.maxY))
                      pathRef.addArc(tangent1End: CGPoint(x: bounds.minX, y: bounds.minY),
                                     tangent2End: CGPoint(x: bounds.midX, y: bounds.minY),
                                     radius: cornerRadius)
      
                      pathRef.addArc(tangent1End: CGPoint(x: bounds.maxX, y: bounds.minY),
                                     tangent2End: CGPoint(x: bounds.maxX, y: bounds.midY),
                                     radius: cornerRadius)
                      pathRef.addLine(to: CGPoint(x: bounds.maxX, y: bounds.maxY))
                      addLine = true
                  } else if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
                      pathRef.move(to: CGPoint(x: bounds.minX, y: bounds.minY))
                      pathRef.addArc(tangent1End: CGPoint(x: bounds.minX, y: bounds.maxY),
                                     tangent2End: CGPoint(x: bounds.midX, y: bounds.maxY),
                                     radius: cornerRadius)
      
                      pathRef.addArc(tangent1End: CGPoint(x: bounds.maxX, y: bounds.maxY),
                                     tangent2End: CGPoint(x: bounds.maxX, y: bounds.midY),
                                     radius: cornerRadius)
                      pathRef.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
                  } else {
                      pathRef.move(to: CGPoint(x: bounds.minX, y: bounds.minY))
                      pathRef.addArc(tangent1End: CGPoint(x: bounds.minX, y: bounds.maxY),
                                     tangent2End: CGPoint(x: bounds.midX, y: bounds.maxY),
                                     radius: cornerRadius)
      
                      pathRef.move(to: CGPoint(x: bounds.maxX, y: bounds.maxY))
                      pathRef.addArc(tangent1End: CGPoint(x: bounds.maxX, y: bounds.maxY),
                                     tangent2End: CGPoint(x: bounds.maxX, y: bounds.midY),
                                     radius: cornerRadius)
                      pathRef.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
                      addLine = true
                  }
      
                  layer.path = pathRef
                  layer.strokeColor = UIColor.lightGray.cgColor
                  layer.lineWidth = 1.0
                  layer.fillColor = UIColor.clear.cgColor
      
                  if addLine == true {
                      let lineLayer: CALayer = CALayer()
                      let lineHeight: CGFloat = (1 / UIScreen.main.scale)
                      lineLayer.frame = CGRect(x: bounds.minX, y: bounds.size.height - lineHeight, width: bounds.size.width, height: lineHeight)
                      lineLayer.backgroundColor = UIColor.clear.cgColor
                      layer.addSublayer(lineLayer)
                  }
      
                  let backgroundView: UIView = UIView(frame: bounds)
                  backgroundView.layer.insertSublayer(layer, at: 0)
                  backgroundView.backgroundColor = .clear
                  cell.backgroundView = backgroundView
      
              }
      

      【讨论】:

        【解决方案8】:

        此答案修复了半径部分中包含超过 2 个单元格的问题。

        半径:cornerRadius -> 0.0

        func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
                let cornerRadius: CGFloat = 4.0
                cell.backgroundColor = UIColor.clear
                let layer: CAShapeLayer = CAShapeLayer()
                let pathRef: CGMutablePath = CGMutablePath()
                //dx leading an trailing margins
                let bounds: CGRect = cell.bounds.insetBy(dx: 15, dy: 0)
                var addLine: Bool = false
                
                if indexPath.row == 0 && indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
                    pathRef.__addRoundedRect(transform: nil, rect: bounds, cornerWidth: cornerRadius, cornerHeight: cornerRadius)
                } else if indexPath.row == 0 {
                    pathRef.move(to: CGPoint(x: bounds.minX, y: bounds.maxY))
                    pathRef.addArc(tangent1End: CGPoint(x: bounds.minX, y: bounds.minY),
                                   tangent2End: CGPoint(x: bounds.midX, y: bounds.minY),
                                   radius: cornerRadius)
                    
                    pathRef.addArc(tangent1End: CGPoint(x: bounds.maxX, y: bounds.minY),
                                   tangent2End: CGPoint(x: bounds.maxX, y: bounds.midY),
                                   radius: cornerRadius)
                    pathRef.addLine(to: CGPoint(x: bounds.maxX, y: bounds.maxY))
                    addLine = true
                } else if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
                    pathRef.move(to: CGPoint(x: bounds.minX, y: bounds.minY))
                    pathRef.addArc(tangent1End: CGPoint(x: bounds.minX, y: bounds.maxY),
                                   tangent2End: CGPoint(x: bounds.midX, y: bounds.maxY),
                                   radius: cornerRadius)
                    
                    pathRef.addArc(tangent1End: CGPoint(x: bounds.maxX, y: bounds.maxY),
                                   tangent2End: CGPoint(x: bounds.maxX, y: bounds.midY),
                                   radius: cornerRadius)
                    pathRef.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
                } else {
                    pathRef.move(to: CGPoint(x: bounds.minX, y: bounds.minY))
                    pathRef.addArc(tangent1End: CGPoint(x: bounds.minX, y: bounds.maxY),
                                   tangent2End: CGPoint(x: bounds.midX, y: bounds.maxY),
                                   radius: 0.0)
                    
                    pathRef.move(to: CGPoint(x: bounds.maxX, y: bounds.maxY))
                    pathRef.addArc(tangent1End: CGPoint(x: bounds.maxX, y: bounds.maxY),
                                   tangent2End: CGPoint(x: bounds.maxX, y: bounds.midY),
                                   radius: 0.0)
                    pathRef.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
                    addLine = true
                }
                
                layer.path = pathRef
                layer.strokeColor = UIColor(fromHexString: "#D8D8D8")?.cgColor
                layer.lineWidth = 1.0
                layer.fillColor = UIColor.clear.cgColor
                
                if addLine == true {
                    let lineLayer: CALayer = CALayer()
                    let lineHeight: CGFloat = (1 / UIScreen.main.scale)
                    lineLayer.frame = CGRect(x: bounds.minX, y: bounds.size.height - lineHeight, width: bounds.size.width, height: lineHeight)
                    lineLayer.backgroundColor = UIColor.clear.cgColor
                    layer.addSublayer(lineLayer)
                }
                
                let backgroundView: UIView = UIView(frame: bounds)
                backgroundView.layer.insertSublayer(layer, at: 0)
                backgroundView.backgroundColor = .clear
                cell.backgroundView = backgroundView
                
            }
        

        【讨论】:

          猜你喜欢
          • 2015-11-16
          • 2012-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          • 2016-02-24
          • 1970-01-01
          相关资源
          最近更新 更多