iOS 8 UITableView分隔符插入0不起作用

时间:2014-09-10 16:05:39

标签: ios objective-c swift uitableview ios8

我有一个应用,UITableView的分隔符插入设置为自定义值 - 右0,左0。这在iOS 7.x中完美有效,但在iOS 8.0中我看到分隔符插入在右侧设置为默认值15。即使在xib文件中它设置为0,它仍然显示不正确。

如何删除UITableViewCell分隔符边距?

42 个答案:

答案 0 :(得分:1067)

iOS 8.0在单元格和表格视图中引入了layoutMargins属性。

此属性在iOS 7.0上不可用,因此您需要确保在分配之前进行检查!

此外,Apple已向您的单元格添加属性,这将阻止其继承您的表格视图的边距设置。设置此属性后,您的单元格可以独立于表视图配置自己的边距。把它想象成一个覆盖。

此属性称为preservesSuperviewLayoutMargins,将其设置为NO将允许单元格的layoutMargin设置覆盖在TableView上设置的layoutMargin。它既节省了时间(您不必修改表格视图的设置),而且更简洁。有关详细解释,请参阅Mike Abdullah的答案。

注意:接下来是针对单元级别边距设置的干净实现,如Mike Abdullah的回答所述。设置单元格preservesSuperviewLayoutMargins=NO将确保表视图不会覆盖单元格设置。如果您确实希望整个表格视图具有一致的边距,请相应地调整您的代码。

设置细胞边距:

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

    // Prevent the cell from inheriting the Table View's margin settings
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }

    // Explictly set your cell's layout margins
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

Swift 4:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // Remove seperator inset
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = .zero
    }
    // Prevent the cell from inheriting the Table View's margin settings
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    // Explictly set your cell's layout margins
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = .zero
    }
}

将单元格上的preservesSuperviewLayoutMargins属性设置为否,以防止表格视图覆盖单元格边距。在某些情况下,它似乎无法正常运作。

如果一切都失败了,您可以强制使用表格视图边距:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    // Force your tableview margins (this may be a bad idea)
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

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

Swift 4:

func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // Force your tableview margins (this may be a bad idea)
    if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
        tableView.separatorInset = .zero
    }
    if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
        tableView.layoutMargins = .zero
    }
}

......你走了!这应该适用于iOS 7和8。

编辑: Mohamed Saleh提请我注意iOS 9中可能发生的变化。您可能需要将表格视图的cellLayoutMarginsFollowReadableWidth设置为{{1}如果要自定义插入或边距。您的里程可能会有所不同,但未记录在案。

此属性仅存在于iOS 9中,因此请务必在设置前进行检查。

NO

Swift 4:

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
} 

(来自iOS 8 UITableView separator inset 0 not working的代码)

编辑:这是一个纯粹的Interface Builder方法:

TableViewAttributesInspector TableViewCellSizeInspector

注:iOS 11更改&简化了大部分此类行为,即将发布更新......

答案 1 :(得分:255)

精氨酸!!!在你的Cell子类中执行此操作之后:

- (UIEdgeInsets)layoutMargins
{
    return UIEdgeInsetsZero;
}

或设置cell.layoutMargins = UIEdgeInsetsZero;为我修复了它。

答案 2 :(得分:178)

让我们花点时间了解问题,然后盲目收费以尝试解决问题。

调试器中的快速浏览将告诉您分隔线是UITableViewCell的子视图。看起来细胞本身对这些细胞系的布局负有相当大的责任。

iOS 8引入了布局边距的概念。默认情况下,视图的布局边距为8pt,并且它们从祖先视图中继承

我们可以告诉您,在布局其分隔线时,UITableViewCell选择尊重左侧布局边距,使用它来约束左侧插图。

将所有这些放在一起,以实现真正零的理想插图,我们需要:

  • 将左侧布局边距设置为0
  • 停止覆盖
  • 的所有继承边距

就这样,这是一项非常简单的任务:

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

注意事项:

  • 此代码仅需要每个单元格运行一次(毕竟你只是配置了单元格的属性),而且你什么时候没什么特别的选择执行它。做一些对你来说最干净的事。
  • 遗憾的是,在Interface Builder中,这两个属性都不可配置,但如果需要,您可以为preservesSuperviewLayoutMargins指定用户定义的运行时属性。
  • 显然,如果您的应用程序也针对早期的操作系统版本,那么在iOS 8及更高版本上运行之前,您需要避免执行上述代码。
  • 不是设置preservesSuperviewLayoutMargins,而是可以配置祖先视图(例如表格)以使0左边距也是如此,但这似乎更容易出错。你不能控制整个等级。
  • 将左边距设置为0并保留其他边距可能会稍微清晰一些。
  • 如果你想在"额外" UITableView在普通样式表格底部绘制的分隔符,我猜测这也需要在表格级别指定相同的设置(还没试过这个!)

答案 3 :(得分:58)

我相信这是我在这里提出的问题:Remove SeparatorInset on iOS 8 UITableView for XCode 6 iPhone Simulator

iOS 8 中,从UIView继承的所有对象都有一个新属性。因此,在iOS 7.x中设置SeparatorInset的解决方案将无法删除您在iOS 8中的UITableView上看到的空白区域。

新属性名为" layoutMargins "。

@property(nonatomic) UIEdgeInsets layoutMargins
Description   The default spacing to use when laying out content in the view.
Availability  iOS (8.0 and later)
Declared In   UIView.h
Reference UIView Class Reference

iOS 8 UITableView setSeparatorInset:UIEdgeInsetsZero setLayoutMargins:UIEdgeInsetsZero

解决方案: -

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }

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

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

如果您设置cell.layoutMargins = UIEdgeInsetsZero;而未检查layoutMargins是否存在,那么该应用将在iOS 7.x上崩溃。因此,最好的方法是在layoutMargins之前检查setLayoutMargins:UIEdgeInsetsZero是否存在。

答案 4 :(得分:46)

您可以在应用程序启动时(加载UI之前)使用UIAppearance一次,将其设置为默认全局设置:

// iOS 7:
[[UITableView appearance] setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];

[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];

// iOS 8:
if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {

    [[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];

}

这样,您可以保持UIViewController的代码干净,并且可以随时覆盖它。

答案 5 :(得分:41)

iOS在单元格和表格视图中引入了layoutMargins属性。

此属性在iOS 7.0中不可用,因此您需要确保在分配之前进行检查!

但是,Apple已向您的单元格添加了一个名为 preservesSuperviewLayoutMargins 属性,这将阻止其继承您的表格视图的边距设置。这样,您的单元格可以独立于表视图配置自己的边距。把它想象成一个覆盖。

此属性称为 preservesSuperviewLayoutMargins ,将其设置为NO可以允许您使用自己的单元格layoutMargin设置覆盖表格视图的layoutMargin设置。它既节省了时间(您不必修改表格视图的设置),而且更简洁。有关详细解释,请参阅Mike Abdullah的答案。

注意:正如Mike Abdullah的回答所表达的那样,这是正确的,不那么混乱的实现;设置单元格的preserveSuperviewLayoutMargins = NO将确保您的表格视图不会覆盖单元格设置。

第一步 - 设置细胞边距:

/*
    Tells the delegate that the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Remove separator inset
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }

    // Explictly set your cell's layout margins
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
}

将单元格上的preservesSuperviewLayoutMargins属性设置为NO ,以防止表格视图覆盖单元格边距。在某些情况下,它似乎无法正常运作。

第二步 - 只有全部失败后,您才可以强制执行表格视图边距:

/*
    Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Force your tableview margins (this may be a bad idea)
    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }

    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }
}

......你走了!这应该适用于iOS 8以及iOS 7。

注意:使用iOS 8.1和7.1进行测试,在我的情况下,我只需要使用此解释的第一步。

只有在渲染单元格下面有未填充的单元格时才需要第二步,即。如果表大于表模型中的行数。不执行第二步将导致不同的分隔符偏移。

答案 6 :(得分:38)

在Swift中,由于layoutMargins是一个属性,因为它更加烦人,所以你必须覆盖getter setter。

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

这将有效地使layoutMargins只读,这在我的情况下是好的。

答案 7 :(得分:22)

对于iOS 9,您需要添加:

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
} 

有关详细信息,请参阅question

答案 8 :(得分:15)

夫特:

override func viewDidLoad() {
    super.viewDidLoad()

    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }
    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }

    self.tableView.layoutIfNeeded()            // <--- this do the magic
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     ...

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

    return cell
}

答案 9 :(得分:11)

我这样做了:

tableView.separatorInset = UIEdgeInsetsZero;
tableView.layoutMargins = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;

答案 10 :(得分:9)

关于cdstamper建议的而不是表视图,在单元格的layoutSubview方法中添加以下行对我有用。

- (void)layoutSubviews 
{
    [super layoutSubviews];

    if ([self respondsToSelector:@selector(setSeparatorInset:)])
                [self setSeparatorInset:UIEdgeInsetsZero];

        if ([self respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)])
        {
            [self setPreservesSuperviewLayoutMargins:NO];;
        }

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

答案 11 :(得分:9)

经过多次调查......

这是完全控制这些东西的唯一方法(我能找到)

完全控制每个单元格上的分隔符插入和布局边距。请在willDisplayCell上的UITableviewDelegate方法中执行此操作。

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

单元格对象控制分隔符,contentView控制其他所有内容。如果您的分隔符插入空间显示为意外颜色,则应解决此问题:

cell.backgroundColor = cell.contentView.backgroundColor

答案 12 :(得分:9)

Swift 3.0示例:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // removing seperator inset
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = .zero
    }
    // prevent the cell from inheriting the tableView's margin settings
    if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    // explicitly setting cell's layout margins
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = .zero
    }
}

答案 13 :(得分:8)

对我来说,简单的一行完成了工作

cell.layoutMargins = UIEdgeInsetsZero

答案 14 :(得分:8)

Swift 的简单解决方案 iOS 8 ,自定义UITableViewCell

override func awakeFromNib() {
    super.awakeFromNib()

    self.layoutMargins = UIEdgeInsetsZero
    self.separatorInset = UIEdgeInsetsZero
}

通过这种方式,您只需设置一次layoutMarginseparatorInset,而不是为每个willDisplayCell设置,因为大多数上述答案都表明了这一点。

如果您使用自定义UITableViewCell,这是正确的地方。 否则你应该在tableView:cellForRowAtIndexPath

中进行

只是另一个提示:您不需要设置preservesSuperviewLayoutMargins = false,因为默认值已经是NO

答案 15 :(得分:7)

只需添加以下代码即可解决此程序。

祝你好运!

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

}

答案 16 :(得分:5)

这是我在Swift中为我工作的代码:

override func viewDidLoad() 
{
    super.viewDidLoad()
    ...
    if tableView.respondsToSelector("setSeparatorInset:") {
        tableView.separatorInset = UIEdgeInsetsZero
    }
}

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath)
{
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset.left = CGFloat(0.0)
    }
    if tableView.respondsToSelector("setLayoutMargins:") {
        tableView.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins.left = CGFloat(0.0)
    }
}

对我来说这似乎是最干净的(现在),因为所有cell / tableView边缘/边距调整都是在tableView:willDisplayCell:forRowAtIndexPath:方法中完成的,而不会将不必要的代码塞进tableView:cellForRowAtIndexPath:

顺便说一下,我只是设置了单元格左侧separatorInset / layoutMargins,因为在这种情况下我不想搞砸我在单元格中设置的约束。

代码更新为Swift 2.2:

 override func viewDidLoad() {
   super.viewDidLoad()       

    if tableView.respondsToSelector(Selector("setSeparatorInset:")) {
      tableView.separatorInset = UIEdgeInsetsZero
        }
    }

 override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) {
        if cell.respondsToSelector(Selector("setSeparatorInset:")) {
            cell.separatorInset.left = CGFloat(0.0)
        }
        if tableView.respondsToSelector(Selector("setLayoutMargins:")) {
            tableView.layoutMargins = UIEdgeInsetsZero
        }
        if cell.respondsToSelector(Selector("setLayoutMargins:")) {
            cell.layoutMargins.left = CGFloat(0.0)
        }
    }

答案 17 :(得分:4)

卢卡斯在斯威夫特的回答:

    // iOS 7:
    UITableView.appearance().separatorStyle = .SingleLine
    UITableView.appearance().separatorInset = UIEdgeInsetsZero
    UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero

    // iOS 8:
    if UITableView.instancesRespondToSelector("setLayoutMargins:") {
        UITableView.appearance().layoutMargins = UIEdgeInsetsZero
        UITableViewCell.appearance().layoutMargins = UIEdgeInsetsZero
        UITableViewCell.appearance().preservesSuperviewLayoutMargins = false
    }

答案 18 :(得分:4)

每次单元格滚动时(使用preservesSuperviewLayoutMargins)都不会更新layoutMarginswillDisplayCell,我建议在cellForRowAtIndexPath:中执行一次:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)

    cell.preservesSuperviewLayoutMargins = false
    cell.layoutMargins = UIEdgeInsetsZero

    return cell

}

答案 19 :(得分:4)

大多数答案显示分隔符插入和布局边距是针对单元格和tableview的各种方法(即viewDidLayoutSubviewswillDisplayCell等)设置的,但我发现只是将这些放在cellForRowAtIndexPath中效果很好。似乎是最干净的方式。

// kill insets for iOS 8
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {
    cell.preservesSuperviewLayoutMargins = NO;
    [cell setLayoutMargins:UIEdgeInsetsZero];
}
// iOS 7 and later
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
    [cell setSeparatorInset:UIEdgeInsetsZero];

答案 20 :(得分:4)

使用下面的代码段,避免在IOS 8&amp; A中使用UITableView时出现不必要的填充问题。 7。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
    {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }

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

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

答案 21 :(得分:3)

在iOS8中:

将此添加到我的UITableViewCell子类:

- (UIEdgeInsets)layoutMargins {
    return UIEdgeInsetsZero;
}

这对于&#34; tableView:cellForRowAtIndexPath&#34;或&#34; tableView:willDisplayCell&#34;:

[editCell setSeparatorInset:UIEdgeInsetsZero];

为我工作。

答案 22 :(得分:3)

这是一种全局删除插图的简便方法。

UITableViewCell+Extensions.swift

import UIKit

extension UITableViewCell {

  override public var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set { }
  }

}

AppDelegate application:didFinishLaunchingWithOptions:

  UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero

你可能会认为a)也只是覆盖扩展中的separatorInset,或者b)设置layoutMargins的外观代理。两者都不会起作用。尽管separatorInset被指示为属性,但尝试将其作为属性(或方法)覆盖会生成编译器错误。并设置UITableViewCell的{​​{1}}的外观代理(或者,就此而言,还设置layoutMargins的{​​{1}}和UITableView的外观代理没有效果。

答案 23 :(得分:2)

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        // ... Get the cell
        cell.separatorInset = UIEdgeInsetsMake(0.f, 20.f, 0.f, [UIScreen mainScreen].bounds.size.width - 20);
        // others
        return cell;
}

对于您要隐藏分隔符的任何特定单元格。

答案 24 :(得分:2)

在3楼看到答案后,我试图找出在TableView和&amp;之间设置分隔符的关系。 TableViewCell并做了一些测试。以下是我的结论:

  1. 我们可以考虑将单元格的分隔符设置为零必须分两步移动分隔符:第一步是将单元格 separatorinset 设置为零。第二步是将单元格 marginlayout 设置为零。

  2. 设置TableView的 separatorinset marginlayout 可以影响Cell的 separatorinset 。但是,从测试中我发现TableView的 separatorinset 似乎没用,TableView的 marginlayout 实际上可以影响单元格<强> marginlayout

  3. 设置Cell的PreservesSuperviewLayoutMargins = false,可以切断TableView对 marginlayout 对单元格的影响。

  4. 其中一个解决方案:

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

答案 25 :(得分:2)

这是我的解决方案。这适用于自定义单元子类,只需将它们都添加到子类中。

  1. - (UIEdgeInsets)layoutMargins {    
        return UIEdgeInsetsMake(0, 10, 0, 10);
    }
    
  2. 2

    self.separatorInset = UIEdgeInsetsMake(0, 10, 0, 10);
    

    您可以方便地自定义分隔符的位置,而无需让设计师为您绘制一个..........

答案 26 :(得分:1)

添加此代码片段,Swift中的简单优雅适用于iOS8:)

    // tableview single line
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.preservesSuperviewLayoutMargins = false
    cell.layoutMargins = UIEdgeInsetsZero
}

答案 27 :(得分:1)

这在iOS 8和iOS 9中非常适合我。

OBJ-C

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

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

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

答案 28 :(得分:1)

以比投票最多的答案更紧凑的方式......

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ([cell respondsToSelector:@selector(setSeparatorInset:)] && [cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)] && [cell respondsToSelector:@selector(setLayoutMargins:)]) {
         [cell setSeparatorInset:UIEdgeInsetsZero];
         [cell setPreservesSuperviewLayoutMargins:NO];
         [cell setLayoutMargins:UIEdgeInsetsZero];
    }

}

答案 29 :(得分:0)

对我来说,除了这个解决方法( Swift 3.0 )之外没有人工作过:

extension UIColor {
    static func colorWith(hex:String, alpha: CGFloat) -> UIColor {
        var cString = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

        if cString.hasPrefix("#") {
            cString.remove(at: cString.startIndex)
        }

        if cString.characters.count != 6 {
            return UIColor.gray
        }

        var rgbValue:UInt32 = 0
        Scanner(string: cString).scanHexInt32(&rgbValue)

        return UIColor(red:   CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
                       green: CGFloat((rgbValue & 0x00FF00) >> 8)  / 255.0,
                       blue:  CGFloat( rgbValue & 0x0000FF)        / 255.0,
                       alpha: alpha)
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdendifier, for: indexPath)

    cell.backgroundColor = UIColor.colorWith(hex: "c8c7cc", alpha: 1) // same color of line separator

    return cell
}

答案 30 :(得分:0)

简单地将这两行放在cellForRowAtIndexPath方法

  • 如果您想要所有分隔线都从零开始 [cell setSeparatorInset:UIEdgeInsetsZero]; [cell setLayoutMargins:UIEdgeInsetsZero];

如果你想要特定的分隔线从零开始,假设这里是最后一行从零开始

if (indexPath.row == array.count-1) 
{
   [cell setSeparatorInset:UIEdgeInsetsZero];
   [cell setLayoutMargins:UIEdgeInsetsZero];
}
else
   tblView.separatorInset=UIEdgeInsetsMake(0, 10, 0, 0);

答案 31 :(得分:0)

在Swift中你可以使用这个

    cell.selectionStyle = UITableViewCellSelectionStyle.None
    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

答案 32 :(得分:0)

只需覆盖“ cellForRowAtIndexPath”并设置“ cell.preservesSuperviewLayoutMargins = false”,“ cell.separatorInset = UIEdgeInsets.zero”和“ cell.layoutMargins = UIEdgeInsets.zero”

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

    let cell: LayoutTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "LayoutCell") as? LayoutTableViewCell



    let currentLayout = OrderLayouts()[indexPath.row]

    cell.NameLabel?.text = currentLayout.name
    cell.DescrLabel?.text = currentLayout.descr

    if(GlobalVariables.debug){

        cell.DescrLabel?.text = "\(currentLayout.id) \n \(currentLayout.descr)"

    }

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


    return cell

}

答案 33 :(得分:0)

enter image description here

使用故事板更改分隔符插入自定义左0和右0, 如果要将分隔符隐藏为无 见上图

答案 34 :(得分:0)

我的解决方案是添加UIView作为单元子视图的容器。然后将此UIView约束(顶部,底部,尾随,前导)设置为0点。所有不必要的大量消失了。the image showing the logic

答案 35 :(得分:0)

根据@cdstamper的回答,更好的地方是UITableViewCell的layoutSubviews,在你的单元格文件中(我设置1%间距,你可以设置为零),所以只需要在这里设置代码来处理所有情况(旋转和其他):

 -(void)layoutSubviews
    {
        [super layoutSubviews];
        if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
            [self setSeparatorInset:UIEdgeInsetsMake(0,self.bounds.size.width*0.01,0,self.bounds.size.width*0.01)];
        }
        if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
            [self setLayoutMargins:UIEdgeInsetsMake(0,self.bounds.size.width*0.01,0,self.bounds.size.width*0.01)];
        }
    }

答案 36 :(得分:0)

iOS 8及更高版本。 Swift 2.0及更高版本:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    if #available(iOS 8.0, *) {
        cell.layoutMargins = UIEdgeInsetsZero
    } else {
        // Fallback on earlier versions
    }
}

答案 37 :(得分:0)

我对上述任何解决方案都没有任何好运。我正在为表格单元格使用NIB文件。我&#34;修复&#34;这是通过添加一个高度为1的标签。我将标签的背景更改为黑色,将标签固定到笔尖的底部,然后将其余内容的底部固定到添加的标签上。现在我的细胞底部有一条黑色边框。

对我来说,这感觉更像是一种黑客,但确实有效。

我唯一的另一个选择是完全消除边界。我还在决定我是否会这样做。

答案 38 :(得分:0)

我经历了所有这些精彩的答案,并意识到其中大多数都不适用于iOS 8,或者可以正常工作,但分隔符会在动画期间改变大小,从而导致不必要的闪烁。这是我在创建窗口之前最终在我的app委托中所做的事情:

[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];
[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];

if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {
    [[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}

这就是我添加到UITableViewController中的内容:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

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

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

我不需要添加任何其他内容。感谢所有提供关键部分的人。

答案 39 :(得分:0)

让我的代码:

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

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

    if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        cell.preservesSuperviewLayoutMargins = NO;
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

答案 40 :(得分:-1)

使用 Swift 2.2

创建import UIKit extension UITableViewCell { func removeMargins() { if self.respondsToSelector(Selector("setSeparatorInset:")) { self.separatorInset = UIEdgeInsetsZero } if self.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) { self.preservesSuperviewLayoutMargins = false } if self.respondsToSelector(Selector("setLayoutMargins:")) { self.layoutMargins = UIEdgeInsetsZero } } }

cellForRowAtIndex

现在您可以在-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.removeMargins()//To remove seprator inset }

中使用
#!/usr/bin/perl/  

use strict;  
use warnings; 
use Data::Dumper; 

#my $filename = '/swpkg/shared/batch_processing/mistints/mistints.csv'; 
my $filename = 'tested.csv'; 

open my $FH, $filename 
  or die "Could not read from $filename <$!>, program halting."; 

# Read the header line.  
chomp(my $line = <$FH>); 
my @fields = split(/,/, $line); 
#print "Field Names:\n", Dumper(@fields), $/; 
print Dumper(@fields), $/;    
my @data; 
    # Read the lines one by one.  
    while($line = <$FH>) { 

    # split the fields, concatenate the first three fields, 
    # and add it to the beginning of each line in the file  
        chomp($line); 
        my @fields = split(/,/, $line); 
        unshift @fields, join '_', @fields[0..2]; 
        push @data, \@fields;
        my $in_date = $fields[14];
        my $db_date = join '-', reverse split /\D/, $in_date;
    } 
    close $FH; 
    print "Unsorted:\n", Dumper(@data); #, $/; 

    @data = sort { 
        $a->[0] cmp $b->[0] || 
        $a->[20] cmp $b->[20] || 
        $a->[23] cmp $b->[23] || 
        $a->[26] cmp $b-> [26] 
    } @data; 


    open my $OFH, '>', '/swpkg/shared/batch_processing/mistints/parsedMistints.csv';
    #print $OFH Dumper(@data);
    print $OFH join(',', @$_), $/ for @data;
    close $OFH;


    #print "Sorted:\n", Dumper(@data); 
    #print "Sorted:", Dumper(@data);

    exit;

答案 41 :(得分:-1)

XCode 7.1 iOS 7,8,9:

将这两行放在TabelViewCell中:

    self.layoutMargins = UIEdgeInsetsZero;
    self.preservesSuperviewLayoutMargins = false;

这对我有用