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

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

如何删除UITableViewCell分隔符边距?


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

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

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

调用此属性preservesSuperviewLayoutMargins,并将其设置为NO允许单元格的layoutMargin设置覆盖layoutMarginTableView上设置的任何内容。它既节省了时间(您不必修改表视图的设置),而且更简洁。有关详细说明,请参阅Mike Abdullah的回答。

注意:以下是针对单元级边距设置的简洁实现,如Mike Abdullah的回答所述。设置单元格的preserveSuperviewLayoutMargins = 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。

编辑: 穆罕默德·萨利赫带给我的注意的iOS 9可能发生变化,您可能需要设置表视图的cellLayoutMarginsFollowReadableWidthNO,如果你想定制插图或利润。您的里程可能会有所不同,但未记录在案。

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

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

斯威夫特4:

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

(以上代码来自iOS 8 UITableView分隔符插入0不起作用

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

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

添加评论

友情链接:蝴蝶教程