动态表格视图单元高度在滚动之前不正确(iOS 8)- 附完整截图

5

编辑

从零开始构建一个新的示例项目,动态表格视图单元格高度完美地工作。然后我试图通过将我的项目裁剪到最低限度来复制它,但仍然存在问题(前几个单元格有缺陷)。附上两个工作和不工作示例的完整项目。项目/代码看起来99%相同,但是我无法找出其中的1%差异。唯一引起我的注意的是我使用了不同的尺寸类别(wAny hAny与wCompact hRegular),但我无法想象这会导致任何问题,因为我只在纵向测试。

工作项目: enter image description here

不工作的项目: enter image description here

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

我在网上搜索了很久,试图理解发生了什么事情,但由于某种原因,在我滚动过原型单元格之前,我的单元格高度不正确。
初始加载时: enter image description here 滚动过每个单元格后: enter image description here 背景颜色: cell.postTextLabel.backgroundColor = [UIColor orangeColor]; subView.backgroundColor = [UIColor blueColor]; contentView.backgroundColor = [UIColor brownColor]; 这里没有做任何太花哨的东西:只有一个原型单元格、一个子视图和三个标签(用户名、时间戳、文本)。
以下截图突出显示了我在Storyboard中的约束条件: enter image description here enter image description here enter image description here enter image description here 我从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;
}

我也遇到过这个问题。我的答案是否有帮助,https://dev59.com/bl4c5IYBdhLWcg3wjq_R#27787736 - rdelmar
很遗憾,对我来说不行。添加到我的自定义单元格中,结果相同。 - SimplyLearning
你解决了吗?我有相同的症状。 - Carlos
我做了 - 结果发现我的问题非常具体,但我只需要将我的大小类更改为wAny和hAny。 - SimplyLearning
6个回答

3

最终,我找到了它不起作用的原因。我下载了你上传到驱动器上的项目,并对其进行了修改。发现了你使用紧凑规则大小的类引起了错误。将你的大小类转换为任何,任何后,它就可以完美地工作了,所以解决方案的关键是将wCompact hRegular更改为wAny hAny。代码没有变化。

这是初步答案。

详细答案:

1)关于大小类,请先阅读苹果公司的this文档。

2)在你的损坏的演示中,大小类被选择如下:

enter image description here

这表示您选择了特定的视图,例如紧凑的宽度和常规的高度,这意味着此自动布局仅适用于特定的iPhone纵向方向。
紧凑宽度 | 常规高度组合指定仅适用于类似iPhone设备在纵向方向上的大小的布局更改。
控件wCompact hRegular表示紧凑的宽度和常规的高度尺寸类别。
我使用以下尺寸类别,并且在您的工程中,我可以看到以下尺寸类别:

enter image description here

在这个尺寸类中它运行良好。
我不知道是苹果的bug还是什么。!!!
如果您只想支持纵向模式和仅限iPhone,则可以在开发信息 -> 设备中选择iPhone。对于方向,您可以在设备方向中选择纵向和倒置。
希望这可以帮助您解决问题。

0
对于我的问题,我设置了UILabel的字体。
layoutSubviews:

这就是问题的原因。

在我把代码移到其他地方之后,它就正常工作了。


0

只需在程序中设置行高即可。

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

5
除非我漏掉了什么...否则这会违背拥有iOS8自动调整单元格的目的,不是吗? - SimplyLearning

0

我也遇到了同样的问题,如何在UITableViewCell中添加UIView

你也有自定义的单元格,所以在你的自定义单元格类中使用以下函数,对于你的情况是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
}

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


抱歉,我不太明白您的意思。您是说我需要通过代码创建所有的框架而不是通过Storyboard吗?目前,在我的自定义单元格类中,我有以下内容。@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 - SimplyLearning
我刚刚分享了我的问题和经验,希望它能对你有所帮助。如果对你没有用,你可以忽略它。谢谢。 - Zeebok
如果你有机会查看的话,我已经上传了完整的示例代码。 - SimplyLearning

0
首先,您必须设置您的详细标签行0,然后给出前导、尾随和底部约束。
viewDidLoad方法中添加:
tableview.estimatedRowHeight = 50.0 //(your estimated row height)
tableview.rowHeight = UITableViewAutomaticDimension

在tableview代理的get方法cell row height中返回行高

在你的代码中

[cell layoutIfNeeded]
[cell updateContraintsIfNeeded]

不需要,所以删掉它


我的详细标签已经设置为0行,并且我有前导、尾随和底部约束。我已经设置了estimatedRowHeight,并且正在使用UITableViewAutomaticDimension。我删除了您建议的两行代码,但是您所说的“在tableview delegate get方法cell row height中返回行高”是什么意思? - SimplyLearning
如果有帮助的话,我已经更新了完整的项目示例代码。 - SimplyLearning
你需要在wCompact和hRegular大小类中设计你的屏幕,而你的工作副本是在wAny和hAny大小类中设计的,所以可能会出现问题。我建议在wAny和hAny大小类中设计我们的视图,这样它就可以兼容任何iPhone或iPad设备。wCompact和hRegular大小类用于iPhone 4、iPhone 5和iPhone 6,因此在iPhone 6 Plus上无法正常工作。 - Hiren
谢谢您回复。wC hR不是与所有设备的纵向模式兼容(包括6+)吗?我现在会尝试将其更改为wA hA,看看是否有所不同。 - SimplyLearning
哇,看起来这个修复了,Hiren!请放心将其作为答案留下,我会很乐意给你应得的荣誉。谢谢! - SimplyLearning
显示剩余6条评论

0

我遇到了同样的问题,尝试使用更大的estimatedRowHeight来容纳您的内容。当使用自适应大小单元格时,SDK似乎会出现一些问题。


1
真遗憾,希望它能这么简单。只需设置 self.tableView.estimatedRowHeight = 1000.0;,但不幸的是没有效果。和第一张截图一样。我觉得这可能与我的约束有关,特别是文本标签(截图中的橙色部分) - 你能看出什么问题吗? - SimplyLearning

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