34

问题是在表格/部分的最后一个单元格中显示分隔符的最正确方法是什么。

基本上这就是我所追求的。

在此处输入图像描述 这是来自原生音乐应用程序,这让我觉得应该可以通过 来实现UITableView,他们不会使用一些私有 API 来分隔单元格,对吧?

我知道你可以不使用实际的分隔符,但在单元格底部添加一条像素线。但我不喜欢这种方法,因为

  1. 选择单元格/突出显示分离器并自动隐藏上一个单元格的分离器时(请参阅第二个屏幕截图,其中选择“您必须疯狂”)。如果我使用单像素线,这是我希望 UITableView 处理而不是自己做的事情(当单元格分隔符没有一直延伸到表格视图的边缘时特别方便,分隔符和选定的单元格背景看起来不在一起很好)。
  2. 我想让我的单元格尽可能平坦以提高滚动性能。

UITableView 参考中也有一些东西让我觉得有一种简单的方法可以得到我想要的东西:

在 iOS 7 及更高版本中,单元格分隔符不会一直延伸到表格视图的边缘。此属性设置表格中所有单元格的默认插入,很像 rowHeight 设置单元格的默认高度。它还用于管理在普通样式表底部绘制的“额外”分隔符。

有人知道如何准确地使用这些在普通样式表底部绘制的“额外”分隔符吗?因为这正是我需要的。我认为分配separatorInsetUITableView, notUITableViewCell可以解决问题,但事实并非如此,最后一个单元格仍然缺少其分隔符。

现在我只看到一个选项:使用自定义部分页脚来模拟最后一个单元格的分隔符。这并不好,特别是如果你想使用tableView:titleForFooterInSection:方法有一个实际的节页脚。

4

14 回答 14

17

这对我来说完美无缺,可以在最后一个单元格中添加分隔符。玩得开心!

self.tableView.tableFooterView = [[UIView alloc] init];
于 2015-03-26T10:46:28.080 回答
14

当您将 headerView 或 footerView 添加到 TableView 时,最后一个分隔线将消失。

下面的示例将让您解决在最后一个单元格上显示分隔符的方法。您唯一需要实现的就是在选择单元格后使此分隔符消失,因此其他单元格的行为与其他单元格相同。

对于 Swift 4.0

override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

    let result = UIView()

    // recreate insets from existing ones in the table view
    let insets = tableView.separatorInset
    let width = tableView.bounds.width - insets.left - insets.right
    let sepFrame = CGRect(x: insets.left, y: -0.5, width: width, height: 0.5)

    // create layer with separator, setting color
    let sep = CALayer()
    sep.frame = sepFrame
    sep.backgroundColor = tableView.separatorColor?.cgColor
    result.layer.addSublayer(sep)

    return result
}
于 2018-01-31T22:14:10.877 回答
9

我刚刚找到了适合我的东西。简而言之:给您的 UITableView 一个 tableFooterView 并将其框架的高度设置为 0。这会显示一个带有正确插图的实际分隔符。

更详细地说:如果您正在使用情节提要,请将 UIView 拖到 Table View 的底部(在左侧的树视图中),以便它显示在 Table View Cell 下方,处于相同的层次结构。这将创建一个 tableFooterView。当然,这也可以通过编程方式完成。

然后,在你的 UITableViewController 的实现中:

UIView *footerView = self.tableView.tableFooterView;
CGRect footerFrame = footerView.frame;
footerFrame.size.height = 0;
[footerView setFrame:footerFrame];

让我知道这是否适合你!如果您改用 tableHeaderView,它也可能适用于第一个分隔符,但我还没有尝试过。

于 2014-08-27T16:43:11.860 回答
5

所以这是Swift 4中一个超级简单的解决方案:

在里面override func viewDidLoad(){},我简单地实现了这行代码:

    self.tableView.tableFooterView = UIView(frame: .zero)

因此,它确保只有最后一个单元格获得分隔符插图。

这对我来说非常有效,希望它也对你有用!

于 2018-05-15T16:10:52.720 回答
3

这将完全符合您的要求..即使该行将占据单元格的整个宽度:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.tableView.separatorColor = [UIColor redColor];
self.tableView.separatorInset = UIEdgeInsetsZero;
于 2013-11-04T13:55:13.717 回答
3

如果您不使用部分,则可以执行以下操作:

- (void)viewDidLoad
{
     self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(insetLeftSide, 0, width - insetRightSide, 1)];
}

如果您使用部分,则将每个部分中的页脚实现为方法中的一个点视图

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
}

这将允许您为最后一个单元格设置一个分隔符,实际上这不是一个分隔符,而是一个页脚,您可以使用它并使其看起来像一个分隔符

于 2014-03-28T15:46:42.837 回答
2

在 iOS 8 中,如果你有一个普通样式的 UITableView,并添加一个页脚,最后一个分隔符就没有了。但是,您可以通过向页脚添加自定义分隔符视图轻松地重新创建它。

此示例完全模仿 Today Widget 分隔符样式

    override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

        //create footer view
        let result = UIView()
        result.frame.size.height = tableView.rowHeight

        //recreate last cell separator, which gets hidden by footer
        let sepFrame = CGRectMake(15, -0.5, tableView.frame.width, 0.5);
        let vibrancyEffectView = UIVisualEffectView.init(effect: UIVibrancyEffect.notificationCenterVibrancyEffect())
        vibrancyEffectView.frame = sepFrame
        vibrancyEffectView.contentView.backgroundColor = tableView.separatorColor
        result.addSubview(vibrancyEffectView)
        return result
}
于 2014-11-13T21:01:43.217 回答
2

我遇到了类似的问题并找到了解决方法。Apple 会隐藏最后一个 uitableviewcell 分隔符,然后在您选择单元格或在该单元格上调用 select 和取消选择时显示它。

所以我教的最好的是在- (void)layoutSubviews. 分隔视图被调用_separatorView,它是一个私有属性。使用单元格的选定/突出显示状态,您可以想出如下内容:

- (void)layoutSubviews
{
    // Call super so the OS can do it's layout first
    [super layoutSubviews];

    // Get the separator view
    UIView *separatorView = [self valueForKey:@"_separatorView"];
    // Make the custom inset
    CGRect newFrame = CGRectMake(0.0, 0.0, self.bounds.size.width, separatorView.frame.size.height);
    newFrame = CGRectInset(newFrame, 15.0, 0.0);
    [separatorView setFrame:newFrame];

    // Show or hide the bar based on cell state        
    if (!self.selected) {
        separatorView.hidden = NO;
    }
    if (self.isHighlighted) {
        separatorView.hidden = YES;
    }
}

像这样的东西。

于 2014-03-27T15:51:09.227 回答
2

斯威夫特 3

我发现了这个老问题,所以我在 Swift 中尝试了同样的方法:

    tableView.tableFooterView = UIView()
    tableView.tableFooterView?.height = 0 // Maybe not necessary

但这导致了另一个问题(在我的情况下)。所以我以不同的方式解决了它。我在本节末尾添加了一个额外的单元格,为空且高度为零:

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return previousNumberOfRows + 1
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
      return indexPath.row == previousNumberOfRows ? 0 : previousCellHeight
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      if indexPath.row == items.count {
        return UITableViewCell()
    } else {
       previousCellInitialization()
    }

这是一个不太简洁的解决方案,但适用于更多情况,如果您有多个部分,现有的页脚视图......

于 2018-05-07T15:02:50.287 回答
1

如果添加空页脚,则 tableview 将删除所有剩余的行分隔符(对于不存在的单元格),但仍将包括最后一个单元格的分隔符:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    return [UIView new]; 
}
于 2015-01-10T21:31:39.480 回答
1

我使用表格视图样式“分组”来添加这一行:

在此处输入图像描述

此外,它避免了在滚动时将最后一个分隔线粘在屏幕上!

于 2020-02-19T17:55:03.453 回答
0

适用于 iOS 7.x 和 8.x(将其放在 cellForRowAtIndexPath 中):

(PS 用您的数组数据源计数替换“数据源的最大元素”)

 if (row == <max elements of your datasource>-1) {
     UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height-1, self.view.frame.size.width, 1)];/// change size as you need.
     separatorLineView.tag = 666;
     separatorLineView.backgroundColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
     UIView *separator = [cell.contentView viewWithTag:666];
     // case of orientation changed..
     if (separator.frame.size.width != cell.contentView.frame.size.width) {
        [[cell.contentView viewWithTag:666] removeFromSuperview];
        separator = nil;
     }
     if (separator==nil) [cell.contentView addSubview:separatorLineView];
 }
于 2015-03-28T08:40:24.693 回答
0

这绝对是有帮助的。在职的。但从属性检查器中设置分隔符“无”。在cellForRowAtIndexPath 方法中编写以下代码

if(indexPath.row==arrData.count-1){
 UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,           
 cell.contentView.frame.size.height - 1.0,      
 cell.contentView.frame.size.width, 1)];

    lineView.backgroundColor = [UIColor blackColor];
    [cell.contentView addSubview:lineView];
}
于 2016-10-14T10:51:53.987 回答
0

下面的代码对我有用:

UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 0.35)];
footerView.backgroundColor = [UIColor whiteColor];
CGRect frame = footerView.frame;
frame.origin.x = 15;
frame.size.width = frame.size.width - 15;
UIView *blackView = [[UIView alloc] initWithFrame:frame];
[blackView setBackgroundColor:[UIColor blackColor]];
blackView.alpha = 0.25;
[footerView addSubview:blackView];
tableView.tableFooterView = footerView;

希望它也适合你。

于 2017-10-17T16:16:50.363 回答