隐藏一个UITableViewCell上的分隔线


250

我正在自定义UITableView。我想隐藏最后一条线单元格 ...我可以这样做吗?

我知道我可以做,tableView.separatorStyle = UITableViewCellStyle.None但是那会影响tableView的所有单元格。我希望它只影响我的最后一个单元格。



你的问题回答了我的。tableView.separatorStyle = UITableViewCellStyle.None不是我需要的那一行
Malachi Holden

Answers:


371

在中viewDidLoad,添加以下行:

self.tableView.separatorColor = [UIColor clearColor];

并在cellForRowAtIndexPath

适用于iOS较低版本

if(indexPath.row != self.newCarArray.count-1){
    UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
    line.backgroundColor = [UIColor redColor];
    [cell addSubview:line];
}

适用于iOS 7更高版本(包括iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

4
这将在iOS7和iOS8上运行。它有效地将分隔符压缩到零。cell.separatorInset = UIEdgeInsetsMake(0,CGRectGetWidth(cell.bounds)/2.0,0,CGRectGetWidth(cell.bounds)/2.0)
哈里斯

9
提醒一下:当您的iDevice是iPad,并且单元格使用了AutoLayout时,“ cell.bounds.size.width”返回的值可能不等于实际单元格的宽度。因此,我始终使用“ tableView.frame.size.width”而不是“ cell.bounds.size.width”。
Veight Zhou

5
请注意:你应该使用[cell.contentView addSubview:line]的,而不是[cell addSubview:line]
阿纳斯塔西

6
更改cell.separatorInset左插图也将更改单元格内容的左插图。不只是分隔​​线。从苹果公司的文档中:“您可以使用此属性在当前单元格的内容与表的左右边缘之间添加空间。正的插入值可将单元格内容和单元格分隔符向内和远离表边缘移动。”
zgjie

9
馊主意。您绝对不应将子视图添加到中的单元格cellForRowAtIndexPath。请记住,单元已被重用。每次重复使用此单元格时,都会添加另一个分隔线视图。在大列表上,这可能会影响滚动性能。这不是正确的方法。
戴夫·巴顿

247

您可以使用以下代码:

斯威夫特:

if indexPath.row == {your row number} {
    cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}

要么 :

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)

对于默认保证金:

cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)

端到端显示分隔符

cell.separatorInset = .zero

目标C:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}

不适用于分组UITableView,但可接受的答案有效。
Aleks N.

3
不适用于iOS9,已对其进行了self.tableView.separatorColor = [UIColor clearColor];修复。

1
这是一个完整的技巧,但在iOS 9中有效的是:cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake(0,0,0,9999)
Pat Niemeyer

这是它在iOS 8+中对我起作用的方式:cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);如果不减去cell.layoutMargins.left值,则分隔线将从左边框绘制到左边缘(如果有)。
Alexandre OS

3
这将推动所有textLabel屏幕外显示。
aehlke

99

跟进Hiren的答案。

ViewDidLoad和以下行中:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

或者,如果您使用的是XIB或情节提要,请将“ 分隔符 ” 更改为“ ”:

界面构建器

并在CellForRowAtIndexPath中添加以下内容:

CGFloat separatorInset; // Separator x position 
CGFloat separatorHeight; 
CGFloat separatorWidth; 
CGFloat separatorY; 
UIImageView *separator;
UIColor *separatorBGColor;

separatorY      = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale);  // This assures you to have a 1px line height whatever the screen resolution
separatorWidth  = cell.frame.size.width;
separatorInset  = 15.0f;
separatorBGColor  = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];

separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];

这是一个结果示例,其中显示带有动态单元格的表视图(但只有一个包含内容的视图)。结果是只有一个分隔符,而不是所有“虚拟”的tableview自动添加以填充屏幕。

在此处输入图片说明

希望这可以帮助。

编辑:对于那些不总是阅读注释的人,实际上有一种更好的方法可以用几行代码来做到这一点:

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

我认为,要隐藏分隔线,这是正确的方法。self.tableView.separatorStyle = .none
arango_86

52

如果您不想自己绘制分隔符,请使用以下命令:

  // Hide the cell separator by moving it to the far right
  cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

不过,此API仅从iOS 7开始可用。


8
separatorInset似乎会插入单元格内容以及分隔符,这需要另一个技巧来弥补:cell.IndentationWidth = -10000;
crishoj

23
更好的方法是将separatorInset顶部,左侧和底部的单元格设置为0,将右侧的单元格宽度设置为: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); 这避免了需要调整任何其他单元格属性的情况。
bryguy1300

如果将单元格边界宽度用于插图,则可能需要在界面旋转时重新计算。
AndrewR

请注意,如果您执行此操作的单元格被重用以绘制您不打算为其隐藏分隔符的另一个单元格,则分隔符也会从中消失。
迈克尔·彼得森

1
UIEdgeInsetsMake(0,10000,0,0); 工作-> UIEdgeInsetsMake(0,0,0,cell.bounds.size.width); 没有。猜想这是因为我有一个讨厌的习惯,要在xib和styoryboard中保留3.5英寸大小的vcs,这在4英寸+设备上的工件会导致375-320像素部分= 55像素剩余。(用友田的声音)非常丑陋!
安东·特罗帕什科

29

我的发展环境是

  • Xcode 7.0
  • 7A220迅捷2.0
  • iOS 9.0

以上答案对我来说不完全有效

经过尝试,我最终的解决方案是:

let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000

其效果是: 在此处输入图片说明


20

设置separatorInset.right = .greatestFiniteMagnitude你的细胞。


调用此功能awakeFromNib可能会导致整个屏幕闪烁applicationDidBecomeActive
Breadbin

这可以通过程序化UITableViewCell创建的设备上的iOS 12.2运行。真好
Womble

在cellForRowAt中进行设置时,设置右分隔符对我有用。最好的解决方案。它适用于iOS 10到13。测试在iOS 10,12和13当被设置左边距然后它不为iOS 10.工作
沙龙Bogdziewicz

18

Swift 3,Swift 4和Swift 5中,您可以像这样编写UITableViewCell的扩展:

extension UITableViewCell {
  func separator(hide: Bool) {
    separatorInset.left = hide ? bounds.size.width : 0
  }
}

然后,您可以按以下方式使用它(当单元格是您的单元格实例时):

cell.separator(hide: false) // Shows separator 
cell.separator(hide: true) // Hides separator

最好将表格视图单元格的宽度分配为左插图,而不是为其分配一些随机数。因为在某些屏幕尺寸上,也许不是现在,但是将来您仍然可以看到分隔符,因为该随机数可能还不够。另外,在横向模式下的iPad中,您不能保证分隔符始终不可见。


这不适用于分组样式的UITableView。您是否有针对分组案例的解决方案?
zslavman

8

适用于iOS 7和8的更好解决方案

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DLog(@"");
    if (cell && indexPath.row == 0 && indexPath.section == 0) {

        DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
        cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
    }
}

如果您的应用程序是可旋转的,请使用3000.0f作为左插入常数,或即时计算。如果尝试设置右插图,则在iOS 8的单元格左侧具有分隔符的可见部分。


1
当您可以执行以下操作时,为什么要使用随机数:MAX([[UIScreen mainScreen] bounds] .size.width,[[UIScreen mainScreen] bounds] .size.height); 以确保它永远消失
Daniel Galasko 2015年

7

在iOS 7中,UITableView分组样式单元格分隔符看起来有些不同。它看起来像这样:

在此处输入图片说明

我尝试了Kemenaran的回答

cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

但是,这似乎不适用于我。我不知道为什么。因此,我决定使用Hiren的answer,但使用UIView代替UIImageView,并以iOS 7样式绘制线条:

UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];

//First cell in a section
if (indexPath.row == 0) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

    UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
    lineBottom.backgroundColor = iOS7LineColor;
    [cell addSubview:lineBottom];
    [cell bringSubviewToFront:lineBottom];

} else {

    //Last cell in the table view
    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];
}

如果使用此选项,请确保在第二个if语句中插入正确的表格视图高度。我希望这对某人有用。


7

在您的UITableViewCell子类中,重写layoutSubviews并隐藏_UITableViewCellSeparatorView。在iOS 10下工作。

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}

上述解决方案均无效,该方法适用于ios 12
Abdul Waheed

这可能会因访问私有API而被App Store拒绝。
Elliot Fiske

5

我认为这种方法在动态细胞的任何情况下都不会起作用...

if (indexPath.row == self.newCarArray.count-1) {
  cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

对于动态单元格,使用哪种tableview方法都没关系,更改inset属性的单元格每次出列时始终始终会设置inset属性,这会导致大量的行分隔符丢失……直到您自己改变。

这样的事情对我有用:

if indexPath.row == franchises.count - 1 {
  cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
  cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}

这样,您在每次加载时都会更新您的数据结构状态


4

在使用iOS 8.4的Swift中

/*
    Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
                        willDisplayCell cell: UITableViewCell,
                        forRowAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 3 {
        // Hiding separator line for only one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
    }
}

注意:以上代码段将在使用动态单元格的UITableView上运行。唯一会遇到的问题是使用带有类别的静态单元格,分隔符类型不同于无分隔符的类型以及表视图的分组样式。实际上,在这种特殊情况下,它不会隐藏每个类别的最后一个单元格。为了克服这个问题,我找到的解决方案是将单元格分隔符(通过IB)设置为none,然后手动创建(通过代码)并将线型视图添加到每个单元格。例如,请检查以下代码段:

/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Row 2 at Section 2
    if indexPath.row == 1 && indexPath.section == 1 {
        // Hiding separator line for one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        // Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
        let additionalSeparatorThickness = CGFloat(1)
        let additionalSeparator = UIView(frame: CGRectMake(0,
            cell.frame.size.height - additionalSeparatorThickness,
            cell.frame.size.width,
            additionalSeparatorThickness))
        additionalSeparator.backgroundColor = UIColor.redColor()
        cell.addSubview(additionalSeparator)
    }
}

在我的项目中,这适用于静态单元格,但不适用于动态单元格。在后一种情况下,最后一个单元格的内容向右移动(就像分隔线一样)。有什么想法,为什么会这样?
巴斯蒂安

上面答案的第一个片段将使用动态单元格在UITableView上工作。唯一会遇到的问题是,当您使用带有类别的静态单元格,分隔符类型不同于无分隔符以及表视图的分组样式时。实际上,在这种特殊情况下,它不会隐藏每个类别的最后一个单元格。为了克服这个问题,我发现的解决方案是将单元格分隔符(通过IB)设置为none,然后手动创建(通过代码)并将线型视图添加到每个单元格。例如,请检查上面答案的第二个片段。
金巫师

它会移动文本(标题),所以没用!
user155

4

使用此子类,设置separatorInset不适用于iOS 9.2.1,将挤压内容。

@interface NSPZeroMarginCell : UITableViewCell

@property (nonatomic, assign) BOOL separatorHidden;

@end

@implementation NSPZeroMarginCell

- (void) layoutSubviews {
    [super layoutSubviews];

    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            if (CGRectGetHeight(view.frame) < 3) {
                view.hidden = self.separatorHidden;
            }
        }
    }
}

@end

https://gist.github.com/liruqi/9a5add4669e8d9cd3ee9


4

这样做更加简单和合乎逻辑:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return [[UIView alloc] initWithFrame:CGRectZero]; }

在大多数情况下,您不希望仅看到最后一个tableCiewCell分隔符。而且这种方法仅删除了最后一个tableViewCell分隔符,您无需考虑自动布局问题(即旋转设备)或设置分隔符插图的硬编码值。


1
欢迎使用Stack Overflow!对于将来的读者来说,一个更好的答案将解释为什么它更简单,更合乎逻辑。
CGritton

一个不错的解决方案!
geek1706 '18 -10-12


3

使用Swift 3并采用最快的黑客方法,您可以使用扩展来改进代码:

extension UITableViewCell {

    var isSeparatorHidden: Bool {
        get {
            return self.separatorInset.right != 0
        }
        set {
            if newValue {
                self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
            } else {
                self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            }
        }
    }

}

然后,当您配置单元格时:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    switch indexPath.row {
       case 3:
          cell.isSeparatorHidden = true
       default:
          cell.isSeparatorHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    if cell.isSeparatorHidden { 
       // do stuff
    }
}

2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }

2

实现此目的的最佳方法是关闭默认的行分隔符,子类UITableViewCell并添加自定义行分隔符作为的子视图contentView-参见下面的自定义单元格,该自定义单元格用于呈现SNStock具有两个字符串属性的类型的对象,ticker以及name

import UIKit

private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1

class SNStockCell: UITableViewCell {

  private let primaryTextColor: UIColor
  private let secondaryTextColor: UIColor

  private let customLineSeparatorView: UIView

  var showsCustomLineSeparator: Bool {
    get {
      return !customLineSeparatorView.hidden
    }
    set(showsCustomLineSeparator) {
      customLineSeparatorView.hidden = !showsCustomLineSeparator
    }
  }

  var customLineSeparatorColor: UIColor? {
   get {
     return customLineSeparatorView.backgroundColor
   }
   set(customLineSeparatorColor) {
     customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
    }
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
    self.primaryTextColor = primaryTextColor
    self.secondaryTextColor = secondaryTextColor
    self.customLineSeparatorView = UIView(frame:CGRectZero)
    super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()

    contentView.addSubview(customLineSeparatorView)
    customLineSeparatorView.hidden = true
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    self.showsCustomLineSeparator = false
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    layoutCustomLineSeparator()
  }

  private func layoutCustomLineSeparator() {
    let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
    let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
    customLineSeparatorView.frame = CGRectMake(horizontalPadding,
      kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
      lineSeparatorWidth,
      kSNStockCellCellLineSeparatorHeight)
  }

  // MARK: Public Class API

  class func cellHeight() -> CGFloat {
    return kSNStockCellCellHeight
  }

  // MARK: Public API

  func configureWithStock(stock: SNStock) {
    textLabel!.text = stock.ticker as String
    textLabel!.textColor = primaryTextColor
    detailTextLabel!.text = stock.name as String
    detailTextLabel!.textColor = secondaryTextColor
    setNeedsLayout()
  } 
}

要禁用默认的行分隔符,请使用tableView.separatorStyle = UITableViewCellSeparatorStyle.None;。消费者方相对简单,请参见以下示例:

private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
  var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
  if (cell == nil) {
    cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
  }
  cell!.configureWithStock(stockAtIndexPath(indexPath))
  cell!.showsCustomLineSeparator = true
  cell!.customLineSeparatorColor = tintColor
  return cell!
}

2

对于Swift 2:

将以下行添加到viewDidLoad()

tableView.separatorColor = UIColor.clearColor()

2

如果接受的答案不起作用,则可以尝试以下操作:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01f; }

这很棒 ;)


1

尝试以下代码,可能会帮助您解决问题

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

   NSString* reuseIdentifier = @"Contact Cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];

} else {
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];

}

    }

    return cell;
}

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

       NSString *cellId = @"cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
       NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;

       if (row == lastRowIndexInSection) {
              CGFloat halfWidthOfCell = cell.frame.size.width / 2;
              cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
       }
}

1

您必须获取自定义单元格并添加Label并设置约束,例如label应该覆盖整个单元格区域。并在构造函数中编写以下行。

- (void)awakeFromNib {
    // Initialization code
    self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
    //self.layoutMargins = UIEdgeInsetsZero;
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

还要如下设置UITableView布局边距

tblSignup.layoutMargins = UIEdgeInsetsZero;

1

除了使用以下变通办法,我无法在特定单元格上隐藏分隔符

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}

1

对于iOS7及更高版本,更干净的方法是使用INFINITY而不是硬编码值。屏幕旋转时,您不必担心更新单元格。

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}

3
警告:使用INFINITY会导致iOS9出现运行时异常
AndrewR

1

正如(许多)其他人指出的那样,您只需将整个UITableView本身关闭即可轻松隐藏所有 UITableViewCell分隔符。例如在您的UITableViewController中

- (void)viewDidLoad {
    ...
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    ...
}

不幸的是,这是一个真正的PITA 每个单元这是上,这正是您真正要问的。

就个人而言,我尝试了无数次更改 cell.separatorInset.left正如(许多)其他人所建议的那样,但问题是引用苹果的话(强调了):

...您可以使用此属性在当前单元格的内容与表格的左右边缘之间添加空格。正的插入值将移动单元格的内容和单元格分隔符向内移动并远离表的边缘...

因此,如果您尝试通过将分隔符移到右侧以外的位置来“隐藏”分隔符,那么最终也可以缩进单元格的contentView。如crifan所建议,您可以尝试通过设置以下方式来补偿这种讨厌的副作用cell.indentationWidthcell.indentationLevel适当地将所有内容移回来,但是我发现这也不可靠(内容仍在缩进...)。

我找到的最可靠的方法是,layoutSubviews重写一个简单的UITableViewCell子类并设置插图,使其到达左插图,从而使分隔符的宽度为0,因此不可见[这需要在layoutSubviews中自动完成处理旋转]。我还向子类添加了一种便捷方法来启用它。

@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end

@implementation MyTableViewCellSubclass

- (void)hideSeparator
{
    _separatorIsHidden = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_separatorIsHidden) {
        UIEdgeInsets inset = self.separatorInset;
        inset.right = self.bounds.size.width - inset.left;
        self.separatorInset = inset;
    }
}

@end

警告:没有可靠的方法来恢复原始的正确插入,因此您不能“取消隐藏”分隔符,因此为什么我使用了不可逆的hideSeparator方法(与暴露分隔符IsHidden相对)。请注意,eparatorInset在重复使用的单元格中持续存在,因此,因为您不能“取消隐藏”,因此需要将这些隐藏的分隔器单元格隔离在各自的复用标识符中。


1

我的要求是隐藏第4个和第5个单元之间的分隔符。我做到了

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 3)
    {
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
    }
}

1

迅速:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

    // remove separator for last cell
    cell.separatorInset = indexPath.row < numberOfRowsInSection-1
        ? tableView.separatorInset
        : UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)

    return cell
}

目标C:

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

    ...

    // remove separator for last cell
    cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
        ? tableView.separatorInset
        : UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);

    return cell;
}

1

在tableview单元格类内部。将这些代码行

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)

不考虑设备/场景布局更改。
Womble

0

在iOS9上,我遇到了一个问题,即更改分隔符插图也会影响text-和detailLabel的位置。

我用这个解决了

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}

不适用于UITableViewCell类-TextLabel和DetailedTextLabel从单元格移开。
Nik Kov
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.