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

所以我有一个UITableView分隔符没有完整的宽度。 它在左侧之前像10个像素结束。 我在viewDidLoad中玩这个代码

self.tableView.layoutMargins = UIEdgeInsetsZero; 

也可以在故事板中select自定义或默认select器。 现在,所有填充的单元格都不具有全宽select器,但空单元格具有全宽度。

我怎么能解决这个问题?

感谢所有的帮助

这对我使用Xcode 6.4和Swift 1.2的iOS 8.4 – 9.0设备有效:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = UITableViewCell() cell.preservesSuperviewLayoutMargins = false cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero return cell } 

Swift 3.0更新

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

好吧,我find了答案。 不知道为什么我以前没有遇到过这个post,当然,当你发布一个问题之后,突然间右边的post出现在你的面前。 我从这个post得到的答案: iOS 8的UITableView分隔符插入0不工作

只需将此代码添加到您的TableViewController

 -(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]; } } 

在你的UITableViewCell中

转到Interface Builder中的属性检查器,只需将“15”更改为0.对所有希望更改的单元执行此操作。

instets

你可能需要添加[cell setLayoutMargins:UIEdgeInsetsZero]; 到你的tableviewcell

我从UITableViewControllerinheritance,并需要额外的willDisplayCell的两个插入设置,以设置preservesSuperviewLayoutMargins willDisplayCell为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 } } 

对于Swift 3:

 override func viewDidLoad() { super.viewDidLoad() tableView.separatorInset = .zero tableView.layoutMargins = .zero } 
  1. select你的UITableViewCell
  2. Atributes督察
  3. 转到分隔符并将其更改为“自定义插入”
  4. 设置left和/或right字段。 (默认left: 15right: 0

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

在这里输入图像说明

结果:

在这里输入图像说明

testing了iOS 9.3和Swift 2.2。 请确保将代码放在willDisplayCell ,该代码在显示单元格之前调用,而不是在仅在单元格中创build单元格的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) {

对于有iPad问题的人 – 这会让你处于与iPhone相同的状态。 然后可以根据需要调整separatorInset。

 tableView.cellLayoutMarginsFollowReadableWidth = false 

以上都不是在Swift 2.2和Xcode 7.3.1中为我工作的

原来是所有的最简单的解决scheme。 没有需要的代码。 只需更改UITableView检查器中的TableView单元布局边距值:

适用于iOS 9或更高版本

如果使用自定义的UITableViewCell:

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

然后在viewDidLoad中为你的tableview:

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

在cellForRowAtIndexPath方法中使用它来configuration单元格的分隔符规格,
它适用于iOS9.0 +

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

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

这些解决scheme都不能在iPad上运行,但是我想出了一个覆盖这两种设备的解决scheme:

使用可重复使用的单元格:

 - (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; 

这两个属性都可以被UITableView&UITableViewCell使用。 后者实际上是UIView的一个属性,它是UITableView和UITableViewCell的父类。