表视图单元格从View Controller返回到Table View Controller时“跳转”

时间:2014-11-15 17:33:14

标签: ios objective-c uitableview ios8 autolayout

我有TableViewController,点击自定义单元格即可转到相关的WebViewController

我遇到的问题是,当我点击"返回"在WebViewController TableViewController"跳过"中的表视图单元格中TableViewController

enter image description here

一旦桌面视图开始滚动,它们就会跳回到正确的高度。所以我假设它与- (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 } } 自定义单元格的高度有关,但我不完全确定。

TableViewController.m

尝试:

- (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,并同时添加{{1}}。

帮助将不胜感激!将发布所需的任何额外信息。谢谢!

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

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

故事板限制:

enter image description here

3 个答案:

答案 0 :(得分:2)

我相信您没有正确设置约束。我之前遇到了类似的问题,并通过设置UILabel的前导,尾随,顶部和底部间距的约束来解决。

玩弄约束。行为将开始改变。继续前进,直到你得到你想要的东西。

这似乎不是专业人士的一个愚蠢的技术答案。但是,如何通过苹果没有正确引入的虚拟约束来解决它。

另外,在cellForRowAtIndexPath中返回单元格之前,请尝试 [cell setNeedsUpdateConstraints]; 。 并且:[cell setNeedsLayout];

答案 1 :(得分:1)

我终于解决了这个问题,关键是计算一个估计的高度。似乎你返回的估计越准确,跳跃/紊乱就越少。

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

答案 2 :(得分:0)

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

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