UITableViewCell圆角和剪辑子视图

时间:2009-08-25 23:52:20

标签: iphone uitableview

我找不到任何地方(搜索引擎,文档,这里等),它们展示了如何在同样剪辑子视图的元素上创建圆角(尤其是在分组表视图中)。

我有一些代码可以正确创建一个带有4个圆弧(圆角)的路径的圆角矩形,这个圆弧已在我的子类uitableviewcell中的drawRect:方法中测试过。问题是,子视图恰好是带有内部uiimageviews的uibutton,不遵守uitableviewcell服从的CGContextClip()。

以下是代码:

- (void)drawRect:(CGRect)rect
{       
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGFloat radius = 12;
    CGFloat width = CGRectGetWidth(rect);
    CGFloat height = CGRectGetHeight(rect);

    // Make sure corner radius isn't larger than half the shorter side
    if (radius > width/2.0)
        radius = width/2.0;
    if (radius > height/2.0)
        radius = height/2.0;    

    CGFloat minx = CGRectGetMinX(rect) + 10;
    CGFloat midx = CGRectGetMidX(rect);
    CGFloat maxx = CGRectGetMaxX(rect) - 10;
    CGFloat miny = CGRectGetMinY(rect);
    CGFloat midy = CGRectGetMidY(rect);
    CGFloat maxy = CGRectGetMaxY(rect);

    [[UIColor greenColor] set];


    CGContextBeginPath(context);

    CGContextMoveToPoint(context, minx, midy);

    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);

    CGContextClip(context);
    CGContextFillRect(context, rect);

    [super drawRect:rect];    
}

由于这种特殊情况是静态的(仅在1个特定的按钮行中显示),我可以编辑用于按钮的图像以获得所需的效果。

HOWEVER ,我有另一个动态的案例。具体来说,是一个分组表,其中包含许多数据库驱动的结果,这些结果将显示可能位于带有圆角的第一行或最后一行的照片,因此需要进行剪裁。

那么, 是否可以创建一个也剪辑子视图的CGContextClip()?如果是这样,怎么做?

5 个答案:

答案 0 :(得分:7)

CALayer对象具有圆角的功能:

UIView * someview = something here;
CALayer * layer = [someview layer];
layer.masksToBounds = YES;
layer.cornerRadius = radius;

你们都准备好了。您还可以添加一些边框颜色和内容,如果您有兴趣,请查看文档。

答案 1 :(得分:3)

请参阅此代码:http://gist.github.com/292384

我在多个项目中使用它,性能非常好,并且可以高度自定义。它不使用cornerRadius,并且单元格的绘制是上下文相关的。

答案 2 :(得分:2)

在您的视图初始化程序中尝试此操作:

self.layer.borderWidth = 2.0f;
self.layer.borderColor = [[UIColor greenColor] CGColor];
self.layer.masksToBounds = YES;
self.layer.cornerRadius = 12.0f;

然后你根本不需要实现任何drawRect方法(至少是为了圆边框和裁剪的目的。)

答案 3 :(得分:0)

创建一个带有圆角和透明度的UIImageView子类。 UITableViewCell本身应该是不透明的,以获得更好的性能。

查看this example

答案 4 :(得分:0)

如果您有自定义UITableViewCell,可以在Swift 4.0中执行此操作:

class CustomTVC: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    self.layer.cornerRadius = 20
    self.layer.masksToBounds = true
}

}