如何删除UITableView中最后一个单元格的最后一个边框?


76

在我的应用程序中,我使用了“UITableView 我的问题”。我的问题是我想删除中最后一个单元格的最后一个边框UITableView

请检查以下图片:

在此处输入图片说明


更改分隔符
插入

Answers:


25

15年9月14日更新。我原来的答案已过时,但它仍然是所有iOS版本的通用解决方案:

您可以隐藏tableView的标准分隔符行,并将自定义行添加到每个单元格的顶部。添加自定义分隔符的最简单方法是添加UIView1px的高度:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, 1)];
separatorLineView.backgroundColor = [UIColor grayColor];
[cell.contentView addSubview:separatorLineView];

到目前为止,我订阅了另一种隐藏额外的分隔符的方式(在iOS 6.1+上有效):

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

6
CGRectZero方法对我不起作用。但是,下面的另一个答案将框架设置为CGRectMake(0,0,self.tableView.frame.size.width,1)确实起作用。
厄瓜多尔

天才回答!拯救了我的一天。
罗希特·曼迪瓦尔

1
厄瓜多尔的评论是正确的。答案不适用于iOS 12,不应将其标记为正确,因为它只是从空白单元格中删除分隔符。
fl034

135

最好的解决方案是添加页脚视图。以下代码完美地隐藏了最后一个单元格的行:

目标C

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];

迅捷4.0

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1))

12
仅在您拥有一个区域时有效
GoodSp33d 2014年

@ GoodSp33d我有多个部分,它通过这种方式工作,if(indexPath.row == [self.tableView numberOfRowsInSection:indexPath.section] - 1) { self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)]; }CellForRowAtIndexPath数据源中
Josh Valdivieso

我的坏话提早了。仅添加该行,我想将默认高度设置为44 px,因此连同该行代码,我将1.0f作为代理中的页脚高度传递给我-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section。现在,它就像一种魅力。上传
GoodSp33d 2014年

42

在iOS 7中,有一个更简单的解决方案。假设单元格是您的最后一个单元格:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);

5
这隐藏了我细胞的全部内容。标签不可见。
karim 2014年

3
不起作用,它只是将标签向右移动。
SamChen

当我将它应用于底部单元格时,在具有固定单元格数量的非滚动表的iOS 7上,我可以完美地工作。
clearlight

不能与“标准”单元格一起使用,因为插图会确定标签的位置。可以与客户单元一起使用。
马特

13

这适用于iOS 7和8:

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));

注意:请谨慎使用tableView.bounds,因为有时它会根据您调用的时间报告错误的值。请参见在横向模式下报告错误边界


在iOS8中也可以完美运行。谢谢
2014年

1
我用它来避免在5.5英寸屏幕上出现奇怪的行为:cell!.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(self.tableView.bounds)-self.view.layoutMargins.left)
卡米洛(Camillo)2015年

当方向首先是纵向,然后是横向时,将出现线条
pableiros

10

在中添加此行代码viewDidLoad()

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))

这确保最后一个分隔符将被替换,并且替换(不可见)的页脚视图将不占据任何额外的高度。由于页脚视图的宽度将由管理UITableView,因此您可以将其设置为0。


唯一对我有用的解决方案是在.zero表格底部保留一个分隔符。
Ido

@Ido您好,只是想让您知道II回滚了您的编辑版本,因为我认为CGRect您添加的扩展名不是一个好习惯。如果您不喜欢0示例代码中的繁琐代码,则可以这样编写:var frame = CGRect.zero \n frame.size.height = 0.001
Jonny

请问为什么这不是一个好习惯?它可以让您使用与相同的方式.zero,但可以使用实际的零(0.001)来满足您的需要。
伊多

因为它不够灵活(如果一天有一天您想要一幅宽度为0.001的框架?),并且属性名称CGRect.myZero不能很好地说明其功能。
强尼

almostZero如果这使它不灵活,则可以调用它。您可以在上面添加一些注释static let ...以对其进行描述(使用3 /,这样您就可以通过xCode的自动完成界面看到它)。
伊多

5

Swift 4基于扩展的解决方案,在iOS 12上进行了测试

我注意到,设置的空视图height = 1也会删除最后一个可见单元格height = 0的分隔符,但是设置只会删除空单元格的分隔符

extension UITableView {
    func removeSeparatorsOfEmptyCells() {
        tableFooterView = UIView(frame: .zero)
    }

    func removeSeparatorsOfEmptyCellsAndLastCell() {
        tableFooterView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: 1)))
    }
}

1
谢谢。事实证明,任何正的非零高度都可以。例如高0.1点。
Womble


3

在Swift中简单地:

tableView.tableFooterView = UIView()

您正在使用Swift 3吗?
DungeonDev

这对我有用。请注意,我用的子类UITableViewController
亚历大通

iOS 13.4.1不起作用,但是```tableView.tableFooterView = UIView(frame:CGRect(x:0,y:0,width:CGFloat.leastNonzeroMagnitude,height:.leastNonzeroMagnitude))```
leo.tan

2

这是我目前使用的补救措施。它可能不是最好的方法,但它可以工作。

删除SeparatorColor和setSeparatorStyle以创建自定义分隔符

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.tableView setSeparatorColor:[UIColor clearColor]];
}

将自定义分隔符添加到具有tableview背景的每个单元格

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    ...

    UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.size.height-1, 320, 1)];
    separatorLineView.backgroundColor = self.tableView.backgroundColor;
    [cell.contentView addSubview:separatorLineView];

    return cell;
}

1
这不适用于具有自定义高度的单元格-在获取单元格高度的点上,单元格尚未完全布置。另外,您不应该使用像320这样的硬编码值-在iPhone 6上看起来如何?
Zorayr

1

对于iOS 7及更高版本

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        BOOL bIsLastRow = NO;

        //Add logic to check last row for your data source
        NSDictionary *dict = [_arrDataSource objectAtIndex:indexPath.section];
        if([_arrDataSource lastObject] == dict)
        {
           bIsLastRow = YES;
        }

        //Set last row separate inset left value large, so it will go outside of view
        if ([cell respondsToSelector:@selector(setSeparatorInset:)]) 
        {
            [cell setSeparatorInset:UIEdgeInsetsMake(0, bIsLastRow ? 1000 :0, 0, 0)];
        }
    }

1

斯威夫特4.2

要获得在最后一个单元格中从左到右的分隔符,请在UITableViewDataSource's tableView(_:cellForRowAt:)实现中添加此分隔符:

if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row {
        cell.separatorInset = .zero
}

如果您不想为一个特定的单元格使用分隔符,请考虑绘制自己的分隔符并设置tableView.separatorStyle = .none


1
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

3
您好,欢迎来到stackoverflow,并感谢您的回答。尽管此代码可以回答问题,但是您可以考虑添加一些说明来解决什么问题以及如何解决该问题吗?这将有助于将来的读者更好地了解您的答案并从中学习。
Plutian

1

下面的代码帮助我从UITableView的最后一行删除分隔符。

斯威夫特3.0

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) {
        cell.separatorInset.right = cell.bounds.size.width
    }
}

0

cellForRow委托中找到最后一个单元格索引,然后从下面放入代码行:

cell.separatorInset = UIEdgeInsetsMake(
    0.f,
    40.0f,
    0.f,
    self.view.frame.size.width-40.0f
);

0

另一种选择是通过子类化UITableView

@synthesize hideLastSeparator = _hideLastSeparator;
@synthesize hideLastSeparatorView = _hideLastSeparatorView;
-(void)setHideLastSeparator:(BOOL)hideLastSeparator {
    if (_hideLastSeparator == hideLastSeparator) {
        return;
    }
    _hideLastSeparator = hideLastSeparator;
    if (_hideLastSeparator) {
        _hideLastSeparatorView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentSize.height, self.bounds.size.width, 0.5f)];
        _hideLastSeparatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
        _hideLastSeparatorView.backgroundColor = self.backgroundColor;
        [self addSubview:_hideLastSeparatorView];
        [self hideSeparator];
    }
    else {
        [_hideLastSeparatorView removeFromSuperview];
        _hideLastSeparatorView = nil;
    }
}
-(void)setContentSize:(CGSize)contentSize {
    [super setContentSize:contentSize];
    if (_hideLastSeparator) {
        [self hideSeparator];
    }
}
-(void)hideSeparator {
    CGRect frame = _hideLastSeparatorView.frame;
    frame.origin.y = self.contentSize.height - frame.size.height;
    _hideLastSeparatorView.frame = frame;
}

该.H应该只包含属性声明为hideLastSeparatorhideLastSeparatorView
要隐藏分隔符时,请使用新类并设置myTableView.hideLastSeparator = YES
它的工作方式是通过在最后一个分隔符上添加新视图来阻塞它。

在我看来,这比使用自定义分隔符或设置最后一个单元格的last splitInset更加容易使用,并且避免了某些tableFooterView有时会因设置方法而引起的怪异动画(例如,在行插入/删除或其他表期间)动画)。


0

如果您将自定义分隔符用于您UITableViewCell的最佳解决方案是:

  1. 在您的自定义单元功能中实现,将其隐藏 separatorView
class YourCell: UITableViewCell {
    // Your implementation goes here...
    // Separator view in cell
    @IBOutlet private weak var separatorView: UIView!

    // This function hides the separator view
    func hideSeparator() {
        separatorView.isHidden = true
    }
}
  1. tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)计算单元格是否为最后一个并隐藏其分隔符时
public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    guard let cell = cell as? YourCell else {
            return
    }
    // Here we're checking if your cell is the last one
    if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
        // if true -> then hide it
        cell.hideSeparator()
    }
}

-2

扩展Tonny Xu的答案,我有多个部分,这似乎可以删除最后一个单元格分隔符

if(indexPath.row == [self.tableView numberOfRowsInSection:indexPath.section] - 1)
{
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];
}

cellForRowAtIndexPath数据源中


1
这取决于一些隐藏的实现细节-您不应该这样做。tableFooterView存在于整个表格,而不仅仅是最后一个单元格。总体而言,骇人听闻的解决方案可能并不总是有效。
Zorayr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.