【问题标题】:Dynamic TableView Cell Heights Incorrect Until After Scrolling (iOS 8) - full screenshots attached滚动后动态 TableView 单元格高度不正确 (iOS 8) - 附上完整的屏幕截图
【发布时间】:2015-07-18 20:21:17
【问题描述】:

编辑

从头开始构建一个新的示例项目,动态 tableview 单元格高度可以完美运行。然后,我尝试通过将我的项目缩减到最低限度来进行复制,但它仍然损坏(前几个单元格有问题)。为工作和不工作的例子附加完整的项目。项目/代码实际上看起来 99% 相同,而且为了我的爱,我无法弄清楚 1% 的差异在哪里。唯一突然出现在我身上的是我使用了不同的尺寸等级(wAny hAny vs wCompact hRegular,但我无法想象这会做任何事情,因为我只在纵向进行测试

工作项目:

不工作的项目:

WORKING (new project from scratch):
https://drive.google.com/file/d/0B_EIkjmOj3ImWXZjVFZMYXZmVGc/view?usp=sharing

NOT WORKING (my project, cleaned up to it's bare minimum)
https://drive.google.com/file/d/0B_EIkjmOj3ImMGRNOXU2RlNkWEk/view?usp=sharing

已经浏览了网络试图了解发生了什么,但由于某种原因,我的单元格高度不正确,直到我滚动经过原型单元格。

初始加载时:

滚动经过每个单元格后:

背景颜色: cell.postTextLabel.backgroundColor = [UIColor orangeColor]; subView.backgroundColor = [UIColor blueColor]; contentView.backgroundColor = [UIColor brownColor];

这里没有做任何太花哨的事情:只是一个原型单元格、一个子视图和三个标签(用户名、时间戳、文本)。

下面的屏幕截图突出显示了我在 Storyboard 中的限制:

我从 Parse 中提取数据,并在设置 tableView 布局时重新加载我的数据

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

最后是我的cellForRowAtIndexPath 方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [self postCellAtIndexPath:indexPath];
}


- (UITableViewCell *)postCellAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *PostCellIdentifier = @"PostCell";
    PostCell *cell = (PostCell *)[self.tableView dequeueReusableCellWithIdentifier:PostCellIdentifier forIndexPath:indexPath];

    [self configurePostCell:cell atIndexPath:indexPath];

    [cell setNeedsLayout];
    [cell layoutIfNeeded];

    [cell setNeedsUpdateConstraints];
    [cell updateConstraintsIfNeeded];



    return cell;
}

【问题讨论】:

  • 我也遇到过这个问题。我的回答有帮助吗,stackoverflow.com/questions/27787552/…
  • 不,不幸的是,这对我来说是不行的。添加到我的自定义单元格中,结果相同
  • 你解决了吗?我有同样的症状。
  • 我做了 - 结果我的问题非常具体,但我只需将我的尺码等级更改为 wAny 和 hAny

标签: ios objective-c uitableview autolayout uistoryboard


【解决方案1】:

最后我找到了为什么它不工作的问题。我下载了您上传到驱动器的项目,并在其中进行了修改。并发现您使用 compact Regular 大小类导致错误的问题。将您的尺码等级转换为 Any, Any 后,它工作正常且完美。所以解决方案的关键是将 wCompact hRegular 更改为 wAny hAny。代码没有变化。

这是最初的答案。

详细回答:

1) 对于尺寸等级,首先阅读苹果的this 文档。

2) 在您损坏的演示中,尺寸等级的选择如下:

这表示您选择了特定视图,例如紧凑宽度和常规高度,这意味着此自动布局仅适用于特定 iPhone 纵向。

紧凑的宽度 |常规高度组合指定布局更改 仅适用于类似于 iPhone 设备的纵向尺寸 方向。

控件 wCompact hRegular 表示紧凑宽度和规则 身高尺寸等级。

我使用了以下尺寸等级,并且在您的工作项目中我可以看到以下尺寸等级:

在这个 Size 类中它工作正常。

我不知道是苹果的错误还是什么。 !!!

如果您只想支持纵向模式和 iPhone,那么您可以在 Development Info -> devices 中选择 iPhone。对于方向,您可以在设备方向中选择纵向和倒置。

希望这可以帮助您找出问题所在。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,请尝试使用更大的估计行高度,它可以包含您的内容。使用自调整单元格时,SDK 似乎做错了。

    【讨论】:

    • 该死,真希望它这么简单。只需设置self.tableView.estimatedRowHeight = 1000.0;,但不幸的是没有骰子。与第一个屏幕截图相同。我觉得这与我的限制有关,尤其是与文本标签(屏幕截图中的橙色)有关 - 你能看出它有什么问题吗?
    【解决方案3】:

    只需以编程方式设置行高。

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath
     {
       return rowHieght;
     }
    

    【讨论】:

    • 除非我遗漏了什么......这会破坏让 iOS8 为您自动调整单元格大小的目的,不是吗?
    【解决方案4】:

    对于我的问题,我在

    中设置了 UILabel 字体
    layoutSubviews:
    

    这就是问题所在。

    在我将代码移到其他地方后,它就可以正常工作了

    【讨论】:

      【解决方案5】:

      我也遇到了同样的问题 how-to-add-uiview-in-uitableviewcell

      您也有自定义单元格,因此请在 customcell 类中使用以下函数,在您的情况下是 PostCell.m。

      - (void)layoutSubviews 
      {
          [super layoutSubviews];
          // in my case i only had set frame here while my other  
          // declarations were in init function, so it solve my problem
      }
      

      它解决了我同样的问题,希望它也能解决你的问题,但你必须在你自己的情况下考虑它。

      【讨论】:

      • 抱歉,没完全跟上。你是说我需要用代码而不是通过情节提要来创建我所有的框架吗?现在,这就是我在 customcell 类中的内容。 @implementation PostCell - (void)layoutSubviews { [super layoutSubviews]; [self.usernameLabel setNeedsLayout]; [self.usernameLabel layoutIfNeeded]; [self.timestampLabel setNeedsLayout]; [self.timestampLabel layoutIfNeeded]; [self.postTextLabel setNeedsLayout]; [self.postTextLabel layoutIfNeeded]; } @end
      • 我刚刚分享了我的问题和经验,希望对您有所帮助。 . .如果它对你没用,你可以忽略它。 . .谢谢
      • 我已经上传了我的完整示例代码,如果你有机会看看的话
      【解决方案6】:

      首先你必须设置你的细节标签行 0 然后给出前导、尾随和底部约束。

      viewDidLoad方法中添加:

      tableview.estimatedRowHeight = 50.0 //(your estimated row height)
      tableview.rowHeight = UITableViewAutomaticDimension
      

      然后在tableview委托get方法单元格行高中返回行高

      在您的代码中

      [cell layoutIfNeeded]
      [cell updateContraintsIfNeeded]
      

      不需要,所以删除它

      【讨论】:

      • 我的详细标签已经设置为 0 行,并且我确实有前导、尾随和底部约束。我确实设置了estimatedRowHeight 并且正在使用UITableViewAutomaticDimension. 我删除了您推荐的两行,但是您的意思是:“然后在tableview委托中返回行高获取方法单元格行高”?
      • -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { }这个方法
      • 如果有帮助,我已经更新了完整的项目示例代码
      • 您能否与我分享您的示例项目,以便我尝试解决您的问题。给代码链接
      • Google 云端硬盘链接发布在上面
      猜你喜欢
      • 1970-01-01
      • 2019-05-23
      • 2017-11-14
      • 2014-11-16
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      相关资源
      最近更新 更多