第一次加载时自动调整单元格不更新高度

时间:2016-08-24 16:12:04

标签: ios uitableview autolayout

我有一个自定义tableViewCell:

enter image description here

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忽略了停用规则的代码。因为停用的规则仍在视图中。

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

我尝试添加:

    [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;
}

2 个答案:

答案 0 :(得分:1)

目前:

  

的cellForRowAtIndexPath

在返回牢房之前,请致电

  

updateConstraintsIfNeeded

在您的示例中,您根本不显示 CellForRowAtIndexPath 方法。 在调用 updateConstraintsIfNeeded

之前,请务必调用 setShowExtraText

在表格视图中调用:

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

之后

  

ReloadData

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

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

答案 1 :(得分:0)

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

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

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

 -(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的想法,让我得到解决方案:)