当前位置: 首页 > 面试题库 >

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

祖麻雀
2023-03-14
问题内容

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

如何删除UITableViewCell分隔页边距?


问题答案:

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

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

简单的解决方法是对单元格进行子类化,并覆盖@ user3570727所建议的layout
margins属性。但是,您将丢失任何系统行为,例如从安全区域继承边距,因此我不建议您使用以下解决方案:

(目标C)

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

(第4.2节):

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

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

除了该layoutMargins属性外,Apple还向您的单元格添加了一个 属性, 以防止其继承您的Table
View的边距设置。设置此属性后,将允许单元独立于表格视图配置其自身的边距。将其视为替代。

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

如果全部失败,则可以强行使用Table View边距:

-(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分隔符inset0的代码不起作用

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

TableViewAttributesInspector
TableViewCellSizeInspector

注意:iOS 11更改并简化了许多这种行为,即将发布更新…



 类似资料:
  • 我在使用Java8的LocalDate和DateTimeFormatterBuilder解析这些日期时遇到了困难。 下面是我尝试解析日期的方法: 执行将引发以下异常:

  • 问题内容: 有没有一种很好的方法可以使用Java流以相同类型的分隔符插入流中的元素? 这类似于Haskell和其他功能语言中的功能。 我已经看到了许多有关如何以类似方式连接字符串的示例,但没有找到任何针对常规列表的解决方案。 问题答案: 您可以使用flatMap来完成此操作,但是在最后一个元素之后会得到一个附加的分隔符: 这是没有尾随分隔符的另一种方式: 这次,我们在每个原始元素之前添加分隔符,并

  • 如果使用带有单个参数的第一个StringToknenizer构造函数并编写示例程序,结果是和12个令牌。它返回没有任何空格的整个句子。我明白这是怎么回事。 如果使用带有两个参数的第二个构造函数,我的测试程序将得到每个单词有空格,但没有逗号,只有两个标记。我认为它应该同时将空格和逗号作为标记分隔符计算,但它将逗号之前的所有内容作为1标记计算,将逗号之后的所有内容作为1标记计算。这部分让我很困惑。 我

  • 问题内容: 由生成的解析器表现出以下有趣的行为,这阻止了我编写模式来解析字符串,例如: 我调试了代码,似乎问题是由年份字段解析超出了字符串的末尾引起的(三个y的最大宽度始终为19)。但是,我不明白如果没有最后的文字,它如何对模式起作用。 有什么办法可以不必使用格式化程序生成器来解决此问题? 编辑: 由于下面的Jarrod确认这是越野车,因此我进行了更多的谷歌搜索,最后找到了错误报告: http:/

  • 本文向大家介绍vue怎么改变插入模板的分隔符?相关面试题,主要包含被问及vue怎么改变插入模板的分隔符?时的应答技巧和注意事项,需要的朋友参考一下 https://cn.vuejs.org/v2/api/#delimiters

  • 问题内容: 我正在尝试在Java Web应用程序中使用StringTemplate生成HTML电子邮件。当尝试输入换行符时,我使用“ 这似乎不起作用”。 效果不佳。有没有办法关闭<和>作为定界符,以便我可以测试这是否是问题所在?整个StringTemplate文档都说使用$ … $作为分隔符,但没有说明如何不使用<…> 问题答案: 创建组时,可以使用以下命令设置分隔符 其中“ $”和“ $”是您的