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设置覆盖TableView上设置的任何layoutMargin 。 它既节省时间( 您不必修改表视图的设置 ),并且更简洁。 详细解释请参考Mike Abdullah的答案。

注意:接下来是一个干净的实施细胞级别的保证金设置 ,如迈克阿卜杜拉的答案中所表达的。 设置你的单元格的保留SuperviewLayoutMargins = 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];
    }
}

将单元格上的保留SuperviewLayoutMargins属性设置为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];
    }
} 

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

编辑: Mohamed Saleh让我注意到iOS 9中可能发生的变化。如果您想自定义cellLayoutMarginsFollowReadableWidth或页边距,您可能需要将Table View的cellLayoutMarginsFollowReadableWidthNO 。 你的里程可能会有所不同,这没有很好记录。

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

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

(上面的代码从iOS 8 UITableView分隔符插入0不工作)

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

TableViewAttributesInspectorTableViewCellSizeInspector

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


精氨酸! 在你的Cell子类中进行这些操作后,

- (UIEdgeInsets)layoutMargins
{
    return UIEdgeInsetsZero;
}

或者设置cell.layoutMargins = UIEdgeInsetsZero; 为我修好了。


让我们花点时间在盲目充电之前了解问题,然后尝试解决问题。

在调试器中快速浏览会告诉你分隔线是UITableViewCell子视图。 看起来单元本身对这些线路的布局承担了相当大的责任。

iOS 8引入了布局边距的概念。 默认情况下,视图的布局边距在所有方面都是8pt ,并且从祖先视图继承。

最好的情况是,在对其分隔线进行布局时, UITableViewCell选择尊重左侧布局边距,使用它来约束左侧插入边界。

把所有这些放在一起,为了达到真正为零的理想插图,我们需要:

  • 将左侧布局边距设置为0
  • 停止任何继承的边界覆盖
  • 像这样,这是一个非常简单的任务:

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

    注意事项:

  • 这个代码只需要在每个单元格中运行一次(毕竟你只是配置单元格的属性),并且当你选择执行它时没有什么特别之处。 做什么似乎对你最清洁。
  • 可悲的是,这两个属性都无法在Interface Builder中进行配置,但如果需要,您可以指定用户定义的运行时属性,用于preservesSuperviewLayoutMargins SupersviewLayoutMargins。
  • 很显然,如果你的应用程序定位到早期的操作系统版本,你需要避免执行上面的代码,直到运行在iOS 8或更高版本上。
  • 您可以配置祖先视图(如表格)以使其具有0左边距,而不是设置preservesSuperviewLayoutMargins视图边距边界,但由于您无法控制整个层次结构,因此这看起来更具错误倾向。
  • 将左边距设置为0并保留其他值可能会稍微更清晰。
  • 如果你想在UITableView在普通样式表底部绘制的“额外”分隔符上有一个0插入,我猜这将需要在表级别指定相同的设置(还没有试过这个!)
  • 链接地址: http://www.djcxy.com/p/51797.html

    上一篇: iOS 8 UITableView separator inset 0 not working

    下一篇: Location Services not working in iOS 8