3

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

cell.layer.cornerRadius = 4;

或作用于整个表视图:

self.tableView.layer.cornerRadius = 4;

但是没有运气......当然我在执行这个操作之前已经导入了 QuartzCore 。看起来只有当表格以普通样式显示时才能自定义角。

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

有什么建议么?

4

7 回答 7

10

以下是在 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
}
于 2019-02-22T20:24:33.913 回答
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 中,您必须找到您在该部分的中间或开始/结束处,并使用具有正确标识符的单元格。

于 2012-09-19T11:38:56.653 回答
2

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

于 2012-09-19T09:48:38.930 回答
1
UIView  *view = [UIView alloc]initWithFrame:YourFrame];
view.layer.cornerRadius = 8;

cell.backgroundView = view;

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

于 2012-09-19T09:59:06.730 回答
1

如果您只需要圆角,还有另一种解决方案(受本地 uitableview(cell) 的分组样式启发,在 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,我也找不到调整背景位置的方法)
  • 不能解决我的整个部分的圆角问题(您必须手动为截面视图圆角)

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

于 2013-11-28T01:23:10.483 回答
0

对于情节提要,在 iOS >= 13.0

将 UITableView 样式设置为Inset Grouped

故事板菜单下拉

于 2021-12-01T01:44:57.187 回答
0

我将我的 tableview 单元格子类化:

class CGStandardCell: UITableViewCell {
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    func setCornerRadius(forIndexPath indexPath: IndexPath, inTableView tableView: UITableView) {
        let lastRow = tableView.numberOfRows(inSection: indexPath.section) - 1
        self.layer.maskedCorners = []

        if indexPath.row == 0 && indexPath.row == lastRow {
            self.cornerRadius = 20
            self.layer.maskedCorners = [.layerMaxXMinYCorner,
                                        .layerMinXMinYCorner,
                                        .layerMinXMaxYCorner,
                                        .layerMaxXMaxYCorner]
        } else if indexPath.row == 0 {
            self.cornerRadius = 20
            self.layer.maskedCorners = [.layerMaxXMinYCorner,
                                        .layerMinXMinYCorner]
        } else if indexPath.row == lastRow {
            self.cornerRadius = 20
            self.layer.maskedCorners = [.layerMinXMaxYCorner,
                                        .layerMaxXMaxYCorner]
        }
    }
}

然后在 tableView(_tableView: UITableView, cellForRowAt indexPath: IndexPath) 中调用

cell.setCornerRadius(forIndexPath: indexPath, inTableView: tableView)

于 2022-01-25T15:40:50.433 回答