代码之家  ›  专栏  ›  技术社区  ›  Brenden

UITableViewCell圆角和剪裁子视图

  •  9
  • Brenden  · 技术社区  · 16 年前

    我在任何地方都找不到任何东西(搜索引擎、文档、此处等)显示如何在同时剪辑子视图的元素上创建圆角(尤其是在分组表视图中)。

    我有一段代码,可以正确地从带有4个圆弧(圆角)的路径中创建一个圆角矩形,这已经在我的子类uitableviewcell的drawRect:方法中进行了测试。问题是子视图(恰好是带有内部UIImageView的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];    
    }
    

    因为这个特定的案例是静态的(仅在一行特定的按钮中显示),所以我可以编辑用于按钮的图像以获得所需的效果。

    然而 ,我有另一个案例是动态的。具体来说,是一个包含大量数据库驱动结果的分组表,其中显示的照片可能位于第一行或最后一行的圆角处,因此需要剪裁)。

    是否可以创建同时剪辑子视图的CGContextClip()?如果是,怎么做?

    5 回复  |  直到 16 年前
        1
  •  7
  •   Nick    16 年前

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

    你们都准备好了。你也可以添加一些边框颜色和其他东西,如果你感兴趣的话可以查看文档。

        2
  •  3
  •   james_womack    16 年前

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

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

        3
  •  2
  •   Matt Connolly    15 年前

    在视图初始化器中尝试以下操作:

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

    drawRect 方法(至少用于圆边框和剪裁。)

        4
  •  0
  •   David    16 年前

    UIImageView 具有圆角和透明度。这个 UITableViewCell 它本身应该是不透明的,以获得更好的性能。

    看看 this example .

        5
  •  0
  •   richc    8 年前

    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
    }
    

    }

    推荐文章