小编典典

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

all

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

如何删除UITableViewCell分隔页边距?


阅读 98

收藏
2022-03-03

共1个答案

小编典典

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

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

简单的解决方法是子类化您的单元格并按照@user3570727
的建议覆盖布局边距属性。但是,您将失去任何系统行为,例如从安全区域继承边距,因此我不推荐以下解决方案:

(目标 C)

-(UIEdgeInsets)layoutMargins { 
     return UIEdgeInsetsZero // override any margins inc. safe area
}

(斯威夫特 4.2):

override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }

如果您不想覆盖该属性,或者需要有条件地设置它,请继续阅读。


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

此属性称为preservesSuperviewLayoutMargins,将其设置为NO将允许单元格的layoutMargin设置覆盖layoutMarginTableView
上设置的任何内容。它既节省时间( 您不必修改表格视图的设置 ),也更简洁。有关详细说明,请参阅 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];
    }
}

斯威夫特 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为 NO 应该可以
防止表格视图覆盖单元格边距。在某些情况下,它似乎无法正常运行。

如果一切都失败了,您可能会暴力破解您的表格视图边距:

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

斯威夫特 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 中可能发生的变化。 如果您想自定义插图或边距,您可能需要将 Table View
设置为cellLayoutMarginsFollowReadableWidthNO您的里程可能会有所不同,这没有很好的记录。

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

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

斯威夫特 4:

if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
    myTableView.cellLayoutMarginsFollowReadableWidth = false
}

编辑:这是一个纯界面生成器方法:

TableViewAttributesInspector
TableViewCellSizeInspector

注意:iOS 11 更改并简化了大部分此行为,即将更新…

2022-03-03