【问题标题】:Auto-resizing Cell not updating height on first load自动调整单元格在第一次加载时不更新高度
【发布时间】:2016-08-24 16:12:04
【问题描述】:

我有一个自定义的 tableViewCell:

Extra text 标签有时会被隐藏,因此单元格应自动调整大小。

这个Extra text 标签是隐藏的,设置 .active = NO;对于标签周围的规则:

-(void)setShowExtraText:(BOOL)showExtraText
{
    _showExtraText = showExtraText;
    if (showExtraText) {

        self.textfieldBottomSuperviewConstraint.active = NO;

        self.extraText.hidden = NO;

        self.textfieldExtraTextConstraint.active = YES;
        self.leadingExtraTextConstraint.active = YES;
        self.extraTextBottomContraint.active = YES;
    }
    else{
        self.extraText.hidden = YES;

        self.textfieldExtraTextConstraint.active = NO;
        self.leadingExtraTextConstraint.active = NO;
        self.textfieldBottomSuperviewConstraint.active = YES;
        self.extraTextBottomContraint.active = NO;
    }
}

只有一个单元格没有隐藏Extra text 标签,这是tableView 中的最后一个。

问题是当 tableView 加载单元格的高度是错误的。还看看它显示的Debug View Hierarchy 忽略了禁用规则的代码。因为已停用的规则仍在视图中。

如果我向下滚动并向上滚动,单元格的布局是正确的,正确显示带有额外文本的单元格和没有额外文本的单元格。

我尝试添加:

    [self setNeedsLayout];
    [self layoutIfNeeded];

我尝试使用 SizeClasses。 (我之前没有使用 sizeClasses )

我的想法用完了,有什么想法吗?

谢谢


更新 1

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithExtraText" forIndexPath:indexPath];

        [cell setShowExtraText:(indexPath.section == LOGIN_SECTION && indexPath.row == REPEAT_PASSWORD_ROW)];

        return cell;
}

更新 2

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithExtraText" forIndexPath:indexPath];

        [cell setShowExtraText:(indexPath.section == LOGIN_SECTION && indexPath.row == REPEAT_PASSWORD_ROW)];

        [cell updateConstraintsIfNeeded];

        [self.tableView beginUpdates];
        [self.tableView endUpdates];

        [self.tableView setNeedsLayout];
        [self.tableView layoutIfNeeded];    

        return cell;
}

【问题讨论】:

    标签: ios uitableview autolayout


    【解决方案1】:

    在:

    CellForRowAtIndexPath

    在返回单元格之前,调用

    updateConstraintsIfNeeded

    在您的示例中,您根本没有显示 CellForRowAtIndexPath 方法。 确保在调用 updateConstraintsIfNeeded

    之前调用您的 setShowExtraText

    并在表视图调用:

    [self.tableView setNeedsLayout];
    [self.tableView layoutIfNeeded];
    

    之后

    重新加载数据

    之后,每次你想要更新你的单元格高度而不重新加载所有tableView,只需单元格

    [self.tableView beginUpdates];
    [self.tableView endUpdates];
    

    【讨论】:

    • 我在 CellForRowAtIndexPath 中的 setShowExtraText 之后添加了 updateConstraintsIfNeeded,但它仍然在做同样的事情。我想我需要做 [cell updateConstraintsIfNeeded]。但我也尝试使用 [tableView updateConstraintsIfNeeded]。他们都没有工作。谢谢
    • 你是对的,我检查了我的代码,每次重新加载我都在我的 tableView 上调用“setNeedsLayout”和“layoutIfNeeded”。以及单元格高度变化的“beginUpdates”和“endUpdates”。 (我正在使用带有 AutoLayout 的 resizingCell)
    • 我按照你说的尝试了,在更新 2 中仍然无法正常工作。谢谢:)
    • @xarly 更新表视图的调用(开始更新,设置需要显示等)应该在调用 reloadTable 视图之后。不在 cellForRow 内
    • MCMatan,但是重新加载表格对于 tableView 来说太费力了。这可能是一个解决方案,但总的来说,我尽量不调用 reloadTable,因为它对性能来说太贵了。谢谢。
    【解决方案2】:

    我认为当您激活和停用自动布局规则时会出现问题。

    如果您在规则或/和视图中更改特征,它可以正常工作。

    例如,这是完美的解决方案:

     -(void)setShowExtraText:(BOOL)showExtraText
     {
         _showExtraText = showExtraText;
    
         if (showExtraText) {
             [self.extraText setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisVertical];
             [self.extraText setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisHorizontal];
         }
         else{
             [self.extraText setContentCompressionResistancePriority:1 forAxis:UILayoutConstraintAxisVertical];
             [self.extraText setContentCompressionResistancePriority:1 forAxis:UILayoutConstraintAxisHorizontal];
         }
     }
    

    我不必使用

    对表格进行任何更新
       [self.tableView beginUpdates];
       [self.tableView endUpdates];
    

    也没有

       [self.tableView setNeedsLayout];
       [self.tableView layoutIfNeeded];
    

    正常工作。

    显然这是一种解决方法,因为我不希望在层次结构中有标签Extra text。使用此解决方案,标签仍然存在,但高度和宽度为 0。

    我希望它对某人有所帮助。

    感谢@MCMatan 的想法,让我得到了解决方案 :)

    【讨论】:

      猜你喜欢
      • 2015-03-03
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多