消除UITableView下面的多余分隔符


714

当我将表格视图设置为4行时,在填充的行下方仍然有额外的分隔线(或额外的空白单元格)。

我将如何去除这些细胞?

UITableView中的额外分隔线的图像

Answers:


1505

界面生成器(iOS 9+)

只需将UIView拖到表中即可。在情节提要中,它将位于自定义单元格下方的顶部。您可能更喜欢将其命名为“页脚”。

为了清楚起见,此处以绿色显示,您可能想要清晰的颜色。

请注意,通过调整高度,可以根据需要影响表格的“底部反弹”。(高度零通常可以)。

在此处输入图片说明


以编程方式执行此操作:

迅速

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

目标C

iOS 6.1以上

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

或者,如果您愿意,

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

过去在iOS中:

添加到表视图控制器...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

如果有必要...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}

我认为您的描述和代码是相反的。无论如何,这对我来说很棒。我只对分组表使用“真实”页脚,因此在代码周围添加了(tableView.style!= UITableViewStyleGrouped){}。现在,所有未分组的表都丢失了多余的单元格,而未分组的表不受影响。
arlomedia

在上面的注释之后,我将添加一条警告,如果您在viewForFooterInSection方法中添加了任何条件,请确保该方法返回UIView或nil。如果您不小心返回了void,您的应用程序将崩溃!
arlomedia'9

4
@Mathieu这将起作用,因为如果表具有自定义页脚,它将不会创建“幻想”行来填充表视图。因此,您将创建一个用作页脚的空视图,并将高度设置为接近0(它不能为零,否则iOS不会渲染它)。通过这个简单的技巧,您将更改默认行为。
J. Costa

2
@ j.Costa:您的解决方案在创建uitableview时仅工作一次。单击最后一个单元格后,您的解决方案不是更好。请改善您的答案。

3
使用tableFooterView会在行的最后一个单元格上留下一个分隔符,因为表格仍预期该单元格下方的内容。使用历史记录方式将消除最后一个分隔符,并在整体上看起来更好。
James Kuang

128

这是不使用分组表样式的另一种方法,您可能不会猜到。在表中添加页眉和页脚(可能一个或另一个都足够,尚未检查)会导致分隔符从填充/空白行中消失。

我偶然发现了这一点,因为我想在桌子的顶部和底部留一点空间,以减少击打按钮的风险,而不是用肉食的手指敲打桌子单元。这是一种将空白视图用作页眉和页脚的方法。使用任意高度,您仍然可以消除多余的分隔线。

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

作为对@Casebash的响应,我返回了我的应用程序中的代码(iTunes商店中的“ AcmeLists”列表管理器...),并将addHeaderAndFooter方法短路以进行验证。没有它,我将有多余的行分隔符。有了代码,您将在此窗口快照中看到:没有表行分隔符picture。所以我不确定为什么它对您不起作用。而且,对我而言,在表视图上具有任何自定义页脚都必须停止为其下方的空白行绘制行分隔符。那太可怕了。作为参考,我查看了行多于在屏幕上无法查看的表,然后查看了两行的表。在这两种情况下,都没有多余的分隔符。

也许实际上没有添加您的自定义视图。要检查,设置背景颜色比其他的东西clearColor,如[UIColor redColor]。如果您在表格底部看不到红色条形,则说明您的页脚未设置。


1
您也可以在IB中执行此操作。而就在TableView中的底部拖动一个UIView并设置高度为1
奥尔特温根茨

70

Swift中删除UITableView中空行的多余分隔线

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}

34

我想扩展wkw的答案:

仅添加高度为0的页脚即可解决问题。(已在SDK 4.2、4.4.1上测试)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

甚至更简单-在设置表视图的位置添加以下行:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

甚至更简单-只需删除任何分隔符即可:

[_tableView setTableFooterView:[UIView new]];

再次感谢wkw :)


这是正确的答案,在其他方法中,因为最后一行没有行分隔符,所以保持不变
Ankush


18

尝试这个。它为我工作:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}

14

对于Swift:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }

11

如果您使用的是Swift,请将以下代码添加到管理tableview的控制器的viewDidLoad中:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}

8

您可以在末尾添加一个空白页脚,然后将其隐藏在空白单元格中,但看起来也很丑陋:

tableView.tableFooterView = UIView()

在此处输入图片说明

有一个更好的方法:在表格视图的末尾添加一条1点线,因为页脚和空白单元格也不再显示。

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

在此处输入图片说明


非常好的输入,但是不需要使您的最后一个单元格的底部具有较厚的分隔符颜色,而只需使其与单元格的背景色相同,它也就消失了。
Gustavo Baiocchi Costa Costa

但是您更喜欢。但是我认为有点“未完成”的分隔符看起来很丑陋。
达科


7

推进J. Costa的解决方案:您可以通过放置以下代码行来对表进行全局更改:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

在第一个可能的方法内部(通常在AppDelegate,in:application:didFinishLaunchingWithOptions:方法中)。


2
对此要小心,在某些情况下,可能会覆盖您预期的页脚,并且您将花费一两天来质疑自己的理智。此外,tableFooterView并未使用UI_APPEARANCE_SELECTOR进行标记,因此实际行为可能随时更改。
mwright

6

我知道这个问题已被接受,但我在这里提出了不同的方法来隐藏额外的分隔线 UITableView

您可以隐藏tableView的标准分隔符行,并将自定义行添加到每个单元格的顶部。

更新:

添加自定义分隔符的最简单方法是添加UIView1px的高度:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

要么

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

要么

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

或者 我喜欢的最好,最简单的方法是

self.tableView.tableFooterView = [[UIView alloc] init];

尝试任何一种;


6

您可能会找到许多有关此问题的答案。它们中的大多数都围绕使用 UITableViewtableFooterView属性进行操作,这是隐藏空行的正确方法。为了方便起见,我创建了一个简单的扩展,该扩展允许从Interface Builder打开/关闭空行。您可以从这个要点文件中签出。我希望它可以节省您的时间。

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

用法:

tableView.isEmptyRowsHidden = true

在此处输入图片说明


5

uitableview额外的分隔线隐藏在swift 3.0中

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

5

如果在最后一个单元格之后不希望使用任何分隔符,则页脚的高度需要接近于零,但高度不能为零。

在您的UITableViewDelegate

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
高超!为我工作!
安东尼·拉普尔


3

只需在tableViewCell的位置x0 y-1处添加具有所需分隔符颜色作为背景色,100%宽度,1px高的视图。确保tableViewCell不会裁剪子视图,而是应该裁剪tableView。

因此,您仅在现有单元之间就可以得到一个绝对简单且有效的分隔符,而无需对每个代码或IB进行任何改动。

注意:在垂直顶部反弹时,会显示第一个分隔符,但这应该不是问题,因为这是默认的iOS行为。


3

我使用表格视图来显示固定数量的固定高度的行,所以我只是调整了大小并使它不可滚动。


3

要以编程方式从UItableview的底部消除多余的分隔符行,只需写下以下两行代码,它将删除其中的多余分隔符。

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

这个技巧一直对我有效,请尝试一下。


2

我很幸运地实现了一个公认的答案(iOS 9 +,Swift 2.2)。我曾尝试实现:

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

但是,这对我没有任何影响tableView-我认为这可能与我使用的事实有关UITableViewController

相反,我只需要重写viewForFooterInSection方法(我没有在tableFooterView其他地方设置):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

这对于只有tableView一个部分的效果很好(如果您有多个部分,则需要指定最后一个)。


2

如果只有一个部分,那么最快和最简单的方法就是将“表视图样式”从“普通”设置为“分组”。(见图片)

TableView分组

如果您有更多的部分,则可能需要将标题高度设置为零(取决于您/您的客户/您的项目经理的口味)

如果您有更多的部分,并且不想弄乱标题(即使在最简单的情况下只是一行),那么也需要将UIView设置为页脚,如前面的答案中所述)


2

Swift 4.0扩展

故事板只是一点扩展:

在此处输入图片说明

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}

2

快速简便的Swift 4方式。

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

如果您有静态单元格。您也可以从“检查器”窗口中关闭分隔符。(如果需要分隔符,这将是不希望的。在这种情况下,请使用上面显示的方法) 检查器窗口


将一个新的UIView设置为tableFooterView已被回答了10次,有关原因的更好解释是更好的代码(您缺少super.viewDidLoad()),并且包含在顶部的Wiki答案中。至于删除所有分隔符,实际上并不是这个问题,因此最好回滚您的上一次编辑和/或完全删除答案。
心教堂

1

如果要删除UITableview中的多余空间,可以使用以下两种方法

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}

1

我添加了这个小的tableview扩展,可在整个过程中提供帮助

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

1

试试这个

对于目标C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

对于斯威夫特

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}

0

尝试这个

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];

0

UIKit不创建空单元格时,tableView有一个tableFooterView。因此,我们可以技巧一下,并指定一个零高度的UIView对象作为的页脚tableView

tableView.tableFooterView = UIView()

0

如果你有一个searchbar在你的view(限制的结果,例如数量),你必须在还添加以下shouldReloadTableForSearchStringshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];

0

在斯威夫特(我使用的是4.0),你可以通过创建自定义完成这个UITableViewCell班,和overridingsetSelected方法。然后separator insets全部为0。(我的主类的表格视图具有清晰的背景)颜色。

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
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.