如何在UITableView中设置分隔符的整个宽度

时间:2014-10-23 00:11:02

标签: ios objective-c iphone uitableview

所以我有一个UITableView,其中分隔符没有全宽。它在左侧前10像素结束。我在viewDidLoad

中玩这个代码
self.tableView.layoutMargins = UIEdgeInsetsZero;

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

我怎么能解决这个问题?

感谢所有帮助

16 个答案:

答案 0 :(得分:205)

这适用于使用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

答案 1 :(得分:102)

好的,我找到了答案。不知道为什么我以前没有遇到这个帖子,但当然在你发布一个问题之后,突然之后,正确的帖子就会出现在你面前。我从这篇文章中得到了答案:iOS 8 UITableView separator inset 0 not working

只需在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];
    }
}

答案 2 :(得分:89)

UITableViewCell

转到Interface Builder中的Attributes Inspector,只需将“15”更改为0.对要更改的所有单元格执行此操作。

instets

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

答案 3 :(得分:20)

对于Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

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

答案 4 :(得分:19)

我从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
        }
}

答案 5 :(得分:17)

  1. 选择您UITableViewCell
  2. 转到 Atributes Inspector
  3. 转到 分隔符 并将其更改为“自定义插播广告”
  4. 设置left和/或right字段。 (默认情况下为left: 15right: 0
  5. 看看它对我有用(使用left: 100):

    enter image description here

    结果:

    enter image description here

答案 6 :(得分:9)

对于遇到iPad问题的人来说,这将使您处于与iPhone相同的状态。然后,您可以根据需要调整separatorInset。

tableView.cellLayoutMarginsFollowReadableWidth = false

答案 7 :(得分:8)

经测试适用于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) {

答案 8 :(得分:8)

适用于iOS 9 +中的swift

如果使用自定义UITableViewCell

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

然后是tableView中的viewDidLoad

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

答案 9 :(得分:7)

默认情况下,分隔符Inset从左起是15。将分隔符Inset选项从auto更改为custom,并将插图设置为0

enter image description here

答案 10 :(得分:6)

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

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

答案 11 :(得分:5)

以上都没有在Swift 2.2和Xcode 7.3.1中为我工作

原来是最简单的解决方案。无需代码。只需在TableViewCell检查器中更改UITableView版面边距值:

答案 12 :(得分:4)

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

答案 13 :(得分:3)

swift 5,Xcode 11更新

将其放置在viewDidLoad()内

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

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

将“ yourTableView”更改为tableView出口名称。

答案 14 :(得分:0)

这些解决方案都不适用于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;

UITableView&可以使用这两个属性。 UITableViewCell。 事实上,后者是UIView的一个属性,它是UITableViewUITableViewCell的父类。 @Url.Action("Edit", "Account", new { Id = user.Id })

答案 15 :(得分:0)

viewDidLoad(测试iOS11 - swift 4.1)

尝试

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