iOS cellフィレットボーダーソリューション

3621 ワード

【シナリオ1】-カスタムcell**フィレットボーダーはUIImageであり、カスタムcellの背景図として機能する.**方法は比較的に簡単で、コードにくっつかないで、上の角を丸くして、下の角を丸くして、角がなくて、上下の角はすべて4枚のピクチャーがあります.判定ロードはsectionのindexpathである.rowは,どのフィレットピクチャをロードするかに対応すればよいが,この方法は簡単であるが,利用効率が高くなく,コード多重性も高くない.
【シナリオ2】-cellのcontentViewのlayerにカスタム枠線を付ける
// cell layer   ,   tableView     
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    CAShapeLayer *layer = [[CAShapeLayer alloc] init];
    CGMutablePathRef pathRef = CGPathCreateMutable();

    CGRect bounds = cell.bounds;
    CGFloat cornerRadius = 10.f;

    if (indexPath.row == 0) {//   cell
        //   
        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + 10, bounds.origin.y + 20);
        //  
        CGPathAddArcToPoint(pathRef, nil, bounds.origin.x + 10, bounds.origin.y, bounds.origin.x + 30, bounds.origin.y, cornerRadius);
        //         ,       
//        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + 20, bounds.origin.y);
//        CGPathAddLineToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 30, bounds.origin.y);
//        CGPathMoveToPoint(pathRef, nil,  bounds.origin.x + bounds.size.width - 30, bounds.origin.y);
        CGPathAddArcToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 10, bounds.origin.y, bounds.origin.x + bounds.size.width - 10, bounds.origin.y + 20, cornerRadius);
        
        //   
        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + 10, bounds.origin.y + 20);
        CGPathAddLineToPoint(pathRef, nil, bounds.origin.x + 10, bounds.size.height);
        //   
        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 10, bounds.origin.y + 10);
        CGPathAddLineToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 10, bounds.size.height);
           }
    if(indexPath.row == [tableView numberOfRowsInSection:indexPath.section] - 1){//    cell
        //   
        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + 10, bounds.origin.y + bounds.size.height);
        CGPathAddLineToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 10, bounds.origin.y + bounds.size.height);
        
        //   
        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + 10, bounds.origin.y);
        CGPathAddLineToPoint(pathRef, nil, bounds.origin.x + 10, bounds.size.height);
        //   
        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 10, bounds.origin.y);
        CGPathAddLineToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 10, bounds.size.height);
    }
    if (indexPath.row != 0 && indexPath.row != [tableView numberOfRowsInSection:indexPath.section] - 1) {//   cell
        //   
        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + 10, bounds.origin.y);
        CGPathAddLineToPoint(pathRef, nil, bounds.origin.x + 10, bounds.size.height);
        //   
        CGPathMoveToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 10, bounds.origin.y);
        CGPathAddLineToPoint(pathRef, nil, bounds.origin.x + bounds.size.width - 10, bounds.size.height);
    }
    layer.path = pathRef;
    CFRelease(pathRef);
    //    
    layer.fillColor = [UIColor whiteColor].CGColor;//       ,         ,        
    layer.strokeColor=[UIColor redColor].CGColor;
    layer.borderWidth = 0.5;
    [cell.contentView.layer insertSublayer:layer atIndex:0];
}


上のコードはとても柔軟に書いて、すべて線をプラスするなどで、プロジェクトの具体的な需要によって具体的に変更することができて、変更しても比較的に弧を描くCGPathAddArcToPointこの方法は参考にしてくださいhttp://blog.csdn.net/u012160319/article/details/44835353
demoはアップロード中です.demoアドレスは明日アップロードします.