为分组UITableView中的第一个和最后一个单元格定制圆角

时间:2012-09-19 09:42:47

标签: iphone rounded-corners uitableview cornerradius

我的iPhone应用程序当前正在显示包含2个部分的分组表。我尝试使用以下方法更改每个部分的第一个和最后一个单元格上的圆角半径(或者在只有一行的部分的情况下在同一单元格上):

cell.layer.cornerRadius = 4;

或采取整个表格视图:

self.tableView.layer.cornerRadius = 4;

但没有运气......当然我在执行此操作之前已导入 QuartzCore 。看起来只有在以简单风格显示表格时才可以自定义角落。

理想的解决方案是自定义最后一个角和底角的顶角。

有什么建议吗?

5 个答案:

答案 0 :(得分:3)

最简单的方法是:

  1. 在xib文件中创建自定义单元格,设置其唯一标识符,如:@"beginCell", @"middleCell", @"endCell"。您可以根据本教程制作它:http://www.bdunagan.com/2009/06/28/custom-uitableviewcell-from-a-xib-in-interface-builder/

  2. 方法 - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 你必须找到你在这个部分的中间或开头/结尾,并使用具有适当标识符的单元格。

答案 1 :(得分:2)

您可以做的是在单元格的背景上添加UIView,使单元格背景为clearcolor。调整UIView以使其具有圆角。

答案 2 :(得分:2)

这是在Swift 4.2中起作用的地方:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let cornerRadius = 5
    var corners: UIRectCorner = []

    if indexPath.row == 0
    {
        corners.update(with: .topLeft)
        corners.update(with: .topRight)
    }

    if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1
    {
        corners.update(with: .bottomLeft)
        corners.update(with: .bottomRight)
    }

    let maskLayer = CAShapeLayer()
    maskLayer.path = UIBezierPath(roundedRect: cell.bounds,
                                  byRoundingCorners: corners,
                                  cornerRadii: CGSize(width: cornerRadius, height: cornerRadius)).cgPath
    cell.layer.mask = maskLayer
}

答案 3 :(得分:1)

UIView  *view = [UIView alloc]initWithFrame:YourFrame];
view.layer.cornerRadius = 8;

cell.backgroundView = view;

不要忘记UITableView背景颜色是透明的。

答案 4 :(得分:1)

如果你只需要圆角,那就是另一个解决方案(灵感来自本机uitableview(单元格)的分组样式,在slowmo :))。它应该是这样的:

细胞亚类...

@interface MyCell : UITableViewCell
@property (nonatomic) top;
@property (nonatomic) bottom;
@end

@implementation MyCell
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.backgroundColor = [UIColor clearColor]; // remove white default background
        //example settings, UIImageViews with resizable images can be used too
        self.backgroundView = [[UIView alloc] init];
        self.selectedBackgroundView = [[UIView alloc] init];
        self.backgroundView.backgroundColor = [UIColor greenColor];
        self.selectedBackgroundView.backgroundColor = [UIColor blueColor];
        self.backgroundView.layer.cornerRadius = self.selectedBackgroundView.layer.cornerRadius = 5; // 
    }
    return self;
}
-(void)layoutSubviews{
    [super layoutSubviews];
    self.backgroundView.frame = self.selectedBackgroundView.frame = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(self.top?0:-self.backgroundView.layer.cornerRadius, 0, self.bottom?0:-self.backgroundView.layer.cornerRadius, 0));
}
-(void)setTop:(BOOL)top{
    _top = top;
    [self setNeedsLayout];
}
-(void)setBottom:(BOOL)bottom{
    _bottom = bottom;
    [self setNeedsLayout];
}
@end

在dataSource中你可以这样做:...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
      ...cell initialization stuff...
      [(MyCell *)cell setTop:(indexPath.row == 0)];
      [(MyCell *)cell setBottom:(indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1)];

      return cell;
}

优点:

  • 所有单元格的一个背景
  • 易于使用
  • 动画(你正在改变位置而不是图像)
  • 也可以用于普通风格(但是注意部分:))

缺点:

    需要
  • 单元格的子类(即使在更改rowHeight后我找不到调整背景位置的方法)
  • 无法解决我整个部分圆角的问题(你必须圆角用于剖面视图)

我希望这有助于某人,但请注意,此代码未经过测试!我在发布这个答案前几分钟实现了这个想法,它似乎有效:)