【问题标题】:Can't indent UITableViewCell subclass不能缩进 UITableViewCell 子类
【发布时间】:2014-09-04 07:43:20
【问题描述】:

我对 UITableViewCell 进行了子类化,以创建一个带有按钮和 2 个标签的自定义单元格。单元格定义是使用 Dave Mark 的 iPhone 开发入门中概述的模式从 xib 加载的。这是基本代码:

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MarketItemCustomCell" owner:self options:nil];

    for (id oneObject in nib)
    {
        if ([oneObject isKindOfClass:[MarketItemCustomCell class]])
        {
            cell = (MarketItemCustomCell *)oneObject;
            break;
        }
    }

标签和按钮按预期显示,但不遵守缩进级别。我已经实现了如下所示的 indentationLevelForRowAtIndexPath,但单元格仍然一直向左对齐。

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        <snip/>
        return 5;
    }

请注意,当我不使用自定义单元格时,缩进级别可以正常工作。

有什么提示吗?

【问题讨论】:

    标签: iphone uitableview indentation


    【解决方案1】:

    iOS 8 更新:以下代码由于某种原因不再有效

    iOS 8 的替代建议:

    考虑创建一个 AutoLayout 约束来表示缩进左边距

    在运行时,修改这个约束来改变缩进级别

    如果你有一个自定义的 UITableViewCell 子类,这个子类可以有一个映射到约束的 IBOutlet。 (遗憾的是苹果没有提供 findConstraintByTag/Id 函数)

    NSLayoutConstraint 具有讽刺意味的“常量”属性可以修改以改变缩进级别。

    对于 iOS 7,此方法有效(但不应再推荐)

    根据 vodkhang 的建议,我在 UITableViewCell sublass 中实现了以下解决方案。不确定这是否是最好的解决方案,但它似乎工作正常。

    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        float indentPoints = self.indentationLevel * self.indentationWidth;
    
        self.contentView.frame = CGRectMake(indentPoints,
                                              self.contentView.frame.origin.y,
                                              self.contentView.frame.size.width - indentPoints, 
                                              self.contentView.frame.size.height);
    }
    

    【讨论】:

    • 这对于缩进内容视图来说非常棒 - 谢谢!缩进单元格本身怎么样?我想我会从上面删除 contentView 并查看 indentationLevel 是否不为 0,但这看起来很恶心。
    • 如何修改 NSLayoutConstraint?
    • NSLayoutConstraint 具有讽刺意味的“常量”属性可以修改以改变缩进级别
    • 扩展 Daniels 的答案,约束系统通过执行以下操作来工作:在 UITableViewDelegate 的 indentationLevelForRowAtIndexPath 方法中,设置正确的缩进级别,然后在 UITableViewCell 子类的 layoutSubviews 方法中通过 self.indentationLevel * 增加约束的常量self.indentationWidth;
    • 没有意识到您可以将 IBOutlet 映射到约束。确实很好的解决方案。
    【解决方案2】:

    我认为您需要在自定义 UITableViewCell 中自定义缩进级别。如果您的自定义 UITableViewCell 已经指定,我猜这个方法(以及像 – tableView:heightForRowAtIndexPath: 这样的方法)不会影响 UITableViewCell 的情况

    【讨论】:

      【解决方案3】:

      如果您在 xib 中设计 UITableViewCell,您将使用 customView 单元格属性,该属性不会自动使用缩进。您可以继承 UITableViewCell 并实现 layoutSubviews 以根据缩进更改框架,或者您可以在表格委托或数据源中配置单元格的任何位置执行相同操作。我希望 Apple 为自定义单元格实现缩进。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多