从视图控制器返回到表格视图控制器时,表格视图单元格会“跳动”

4
我有一个 TableViewController,点击自定义单元格会进入相应的 WebViewController

我遇到的问题是,在 WebViewController 中点击“返回”按钮时,TableViewController 中的表视图单元格会“跳动”。
一旦表视图开始滚动,它们就会回到正确的高度。所以我认为这可能与 TableViewController 自定义单元格的高度有关,但我不确定。 TableViewController.m 尝试过:
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    id model = self.Model[indexPath.row];

    if ([model isKindOfClass:[Two self]]) {
        return 490; // As of 11/13/14
    } else { // 2 other custom cells
        return tableView.rowHeight; // return the default height
    }
}

同类产品:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    id model = self.Model[indexPath.row];

    if ([model isKindOfClass:[One self]]) {
    ListTableViewCell *cellOne = [tableView dequeueReusableCellWithIdentifier:@"1Cell"];
    CGFloat heightOne = [cellOne.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return heightOne + 2;

    } else if ([model isKindOfClass:[Two self]]) {
    ListTableViewCellTwo *cellTwo = [tableView dequeueReusableCellWithIdentifier:@"2Cell"];
    CGFloat heightTwo = [cellTwo.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return heightTwo + 400;

    } else if ([model isKindOfClass:[Three self]]) {
    ListTableViewCellThree *cellThree = [tableView dequeueReusableCellWithIdentifier:@"3Cell"];
    CGFloat heightThree = [cellThree.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return heightThree + 2;

    } else {
        return 300;
    }
}

更新:

已尝试[cell setNeedsUpdateConstraints];[cell setNeedsLayout];

已尝试在多个不同的位置设置estimatedHeight,并添加了Automatic Row Dimension

需要帮助!如需更多信息,请发布。谢谢!

我只支持iOS 8。我正在使用自动布局和故事板。

自定义单元格2的其他Storyboard信息: enter image description here enter image description here

故事板限制:

enter image description here


只需确保在height方法中仅返回490,然后删除其他任何内容。你得到了什么? - hasan
在展示WebViewController后,self.Model是否被修改了? - nsinvocation
@gottlieb 在显示 WebViewController 后,self.Model 没有被修改过。有什么想法吗? - SRMR
@gottlieb 将其推入导航堆栈中 - SRMR
你的单元格高度约束是多少? - Andy Obusek
显示剩余7条评论
3个回答

2
我认为您没有正确设置约束。我之前遇到过类似的问题,并通过将Leading、Trailing、Top和Bottom间距约束设置到UILabel上解决了问题。
尝试调整约束,行为会开始改变。持续尝试直到达到您想要的结果。
这似乎不是一个专业人士的良好技术答案。但是,使用这些虚拟的约束可以解决苹果没有适当介绍的问题。
此外,在cellForRowAtIndexPath中返回单元格之前尝试使用[cell setNeedsUpdateConstraints];[cell setNeedsLayout];

谢谢您的评论,我刚刚添加了我的约束截图以便更好地帮助。我一直在尝试调整约束,想着可能是我设置不正确,但即使在故事板中没有错误或警告,我仍然无法完全正确地设置约束。我原本认为它们是完美的,所以现在我正在查看我的代码,看看是否有遗漏。如果您在我的约束中发现任何值得注意的地方,请告诉我。谢谢! - SRMR
对于标签,只保留与容器相关的约束条件,移除与图像视图相关的约束条件,并告诉我新的行为是什么。 - hasan
如果我使用静态值,它就不会跳跃,但是当我不使用静态值时,它就会跳跃。 - SRMR

1

我终于解决了这个问题,关键是计算出一个预估高度。看起来你返回的预估值越准确,跳动和卡顿就越少。

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
     switch (yourTypeOfCell) {
         case something:
            return estimatedHeight;
            break;
         case default:
            return defaultValue;
            break;
     }
}

0

尝试在viewDidLoad中设置estimatedRowHeight,以帮助UIKit猜测您的tableView的行高

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = 490.0;
}

我已经尝试过了,但是因为它并没有改变表视图单元格"跳动"的行为,所以我对其进行了注释。还有其他的想法吗?谢谢! - SRMR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接