如何在 UITableView 中设置分隔符的全宽

我有一个 UITableView分隔符没有全宽。在左边前面10个像素。我在 viewDidLoad()里玩这个代码。

self.tableView.layoutMargins = UIEdgeInsetsZero;

也在故事板当你可以选择自定义或默认选择器。现在所有填充的单元格都没有全宽选择器,但是空的单元格有全宽选择器。

我该怎么补救?

92912 次浏览

我从这篇文章中得到了答案: IOS8UITableView 分隔符插入0不工作

只要在你的 UITableViewController上加上这个代码

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}


if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}


-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}


if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}

我从 UITableViewController继承,需要在 willDisplayCell中的两个插入设置之外再添加一些设置,以便将 preservesSuperviewLayoutMargins设置为 false。在 Swift 中,它是这样的:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {


if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
cell.preservesSuperviewLayoutMargins = false
}
}

这对我在 iOS 8.4-9.0设备上使用 Xcode 6.4和 Swift 1.2很有效:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = UITableViewCell()




cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero


return cell
}

Swift 5更新:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

在你的 UITableViewCell

到你 Interface Builder 的属性检查器,简单地把“15”改成“0”。对希望更改的所有单元格执行此操作。

instets

您可能需要将 [cell setLayoutMargins:UIEdgeInsetsZero];添加到 tableViewCell

测试了 iOS 9.3和 Swift 2.2。确保在显示单元格之前将代码放在 willDisplayCell中,而不是仅创建单元格的 cellForRowAtIndexPath中。

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
}

override添加到 UITableViewController的函数中,如下所示:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

在 Swift 2.2和 Xcode 7.3.1中,以上这些都不适合我

结果是最简单的解决方案。不需要代码。只需更改 UITableView检查器中的 TableViewCell布局边距值:

适用于 iOS9 + 环境下的 Swift

如果使用自定义 UITableViewCell:

override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}

然后是 viewDidLoadUITableView:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

cellForRowAtIndexPath方法中使用它来配置单元格的分隔符规格,
它在 iOS9.0 + 上运行完美

 cell.separatorInset = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;

对于 Swift 3:

override func viewDidLoad() {
super.viewDidLoad()


tableView.separatorInset = .zero
tableView.layoutMargins = .zero
}

这些解决方案都不适用于 iPad,但我想出了一个同时适用于这两种设备的解决方案:

使用可重复使用的电池:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
...[other code]...
[cell setLayoutMargins:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
return cell;
}

不可重复使用的电池:

- (void)removeSeparatorInset:(UITableView*)tableView{
NSArray *cells = [tableView visibleCells];
for (UITableViewCell *cell in cells){
[cell setLayoutMargins:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}


-(void) viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
[self removeSeparatorInset:self.tableView];
}

扩展一下这个方法:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

这两个属性都可以由 UITableViewUITableViewCell使用。 后者实际上是 UIView的一个属性,UIViewUITableViewUITableViewCell的父类。

  1. 选择你的 UITableViewCell
  2. 转到 属性检视员
  3. 转到 分离器并将其改为 “自定义插图”
  4. 设置 left和/或 right字段(默认 left: 15right: 0)

看看它是如何工作的(使用 left: 100) :

enter image description here

结果:

enter image description here

对于有 iPad 问题的人来说,这会让你处于和 iPhone 一样的状态。然后您可以根据需要调整 separatorInset

tableView.cellLayoutMarginsFollowReadableWidth = false

对于斯威夫特3:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
}

viewDidLoad(测试 iOS11-Swift 4.1)

试试看

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)

默认情况下,分离器 Inset从左起15。将分离器 Inset选项从 auto更改为 custom,并将插入设置为 0

enter image description here

Swift 5 Xcode 11更新

把这个放在 viewDidLoad ()中

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

对于 edge to edge 分隔符,只需将 left 和 right 的值设置为0。

顺便将“ yourTableView”更改为 tableViewOutlet 名称。