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

时间:2012-08-28 21:48:26

标签: iphone objective-c ios xcode uitableview

在我的应用中,我使用UITableView 我的问题是我要删除UITableView中最后一个单元格的最后一个边框。

请检查以下图片:

enter image description here

21 个答案:

答案 0 :(得分:123)

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

<强>目标C

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

Swift 4.0

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

答案 1 :(得分:40)

在iOS 7中有一个更简单的解决方案。假设细胞是你的最后一个细胞:

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

答案 2 :(得分:22)

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

您可以隐藏tableView的标准分隔线,并在每个单元格的顶部添加自定义行。添加自定义分隔符的最简单方法是添加1px高度的简单UIView

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

到目前为止,我订阅another way以隐藏单元格下方的额外分隔符(适用于iOS 6.1 +):

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

答案 3 :(得分:13)

这适用于iOS 7和8:

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

注意:请谨慎使用tableView.bounds,因为它有时会报告错误的值,具体取决于您何时调用它。见Reporting incorrect bounds in landscape Mode

答案 4 :(得分:5)

viewDidLoad()

中添加此行代码
tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))

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

答案 5 :(得分:3)

我的缩短版本:

self.tblView.tableFooterView = [UIView new];

答案 6 :(得分:2)

不,你不能这样做。这些分离器非常干净,风格和颜色都很好。 但是,另一种解决办法可能是将所有分隔符关闭,并在底部设置一个背景图像,除了最后一个外,所有单元格都在底部。

E.X:

    [tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    if (indexPath.row == [myArray count] - 1) {
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
        [cell setBackgroundView:imageView];
    }

答案 7 :(得分:2)

这是我目前使用的补救措施。它可能不是最好的方法,但它确实有效。

删除SeparatorColor和setSeparatorStyle以制作自定义分隔符

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

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

使用tableview background

为每个单元格添加自定义分隔符
- (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;
}

答案 8 :(得分: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)];
        }
    }

答案 9 :(得分:1)

Xcode 12、Swift 5

要删除最后一个单元格后的分隔符,请选择分组的 UITableView 样式 You can do that in Interface Builder 或在 viewDidLoad 中设置

tableView.style = UITableView.Style.grouped

去掉第一个单元格前的空白,在viewDidLoad中写下这段代码:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.width, height: 0.1))

为了删除单元格之前的空白区域,并且您将在导航栏下滚动它或在避免空白区域方面遇到其他困难,请尝试将您的表格限制为控制器的超级视图 Here double click the top constraint 然后选择“SuperView.Top”at the constraint settings

如果您想要全角分隔符或您自己的宽度,只需选择分隔符插入为自定义,并配置为您的值,或将其写入 viewDidLoad:

tableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

答案 10 :(得分:1)

简单地说:

tableView.tableFooterView = UIView()

答案 11 :(得分:1)

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

Swift 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 } }

答案 12 :(得分:1)

针对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)))
    }
}

答案 13 :(得分:0)

这对我很有用:

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 == numberOfCells.count - 1 {
        cell.separatorInset.left = UIScreen.main.bounds.width
    }
}

我们在这里所做的是将左插图的大小设置为足够大的值,以便分隔线不再可见。因此,当我们增加插图的大小值时,它会越来越靠近屏幕右侧,因为左侧插图朝向右侧。

答案 14 :(得分:0)

最合适和最简单的方法是在 cellForRowAt

cell.drawBottonLine = (indexPath.row != sections[0].rows.count - 1)

答案 15 :(得分: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()
    }
}

答案 16 :(得分:0)

Swift 4.2

要获得在最后一个单元格中从左到右的分隔符,请将其添加到您的#include<bits/stdc++.h> using namespace std; int main () { string str="appleap",str1; for(int i=0;i<str.size();i++) str1[i]=str[i]; cout<<"xxxxxx "<<str1<<endl; cout<<str1[0]<<str1[1]<<str1[2]<<str1[3]<<str1[4]<<str1[5]<<str1[6]<<endl; } UITableViewDataSource's实现中:

tableView(_:cellForRowAt:)

如果您不想为一个特定的单元格使用分隔符,请考虑绘制自己的分隔符并设置if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row { cell.separatorInset = .zero }

答案 17 :(得分: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 这种方式的工作方式是通过在其上添加新视图来阻碍最后一个分隔符。

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

答案 18 :(得分:0)

cellForRow委托中查找最后一个单元格索引,并从下面输入代码行:

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

答案 19 :(得分:0)

  

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

答案 20 :(得分:-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数据源