动态TableView单元格高度不正确直到滚动之后(iOS 8) - 附加完整屏幕截图

时间:2015-05-08 02:49:49

标签: ios objective-c uitableview autolayout uistoryboard

修改

从头开始构建一个新的示例项目,动态tableview单元格高度正常运行。然后我尝试通过将我的项目修剪到最低限度来复制它并且它仍然被打破(前几个单元格错误)。为工作示例和非工作示例附加完整项目。项目/代码字面上看起来99%相同,因为对我的爱无法弄清楚1%的差异在哪里。对我来说唯一突然出现的是我使用了不同大小的类(wAny hAny vs 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;
}

6 个答案:

答案 0 :(得分:3)

最后我发现了问题,为什么它不起作用。我下载了由您上传到驱动器的项目,并对其进行了修改。并发现您使用紧凑的常规大小类导致错误的问题。将您的尺寸类别转换为任意,任意后,它的工作正常且完美。因此解决方案的关键是将 wCompact hRegular 更改为 wAny hAny。代码没有变化。

这是最初的答案。

详细答案:

1)对于size类,首先阅读apple的this文档。

2)在破碎的演示中,选择尺寸等级如下:

enter image description here

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

  

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

     

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

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

enter image description here

在这个尺寸类中,它工作正常。

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

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

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

答案 1 :(得分:0)

我遇到了同样的问题,只是尝试使用更大的estimatedRowHeight,它可以包含您的内容。使用自定义单元格时,SDK似乎做错了。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我也有同样的问题, 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
}

它解决了我同样的问题,希望它也会解决你的问题,但你必须在自己的场景中考虑它。

答案 4 :(得分:0)

首先,您必须设置详细信息标签行0,然后给出前导,尾随和底部约束。

viewDidLoad方法中添加:

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

然后返回tableview委托get行单元格行高

中的行高

在你的代码中

[cell layoutIfNeeded]
[cell updateContraintsIfNeeded]

不需要删除它

答案 5 :(得分:0)

对于我的问题,我在

中设置了UILabel字体
layoutSubviews:

那导致问题。

将代码移动到其他地方后,它就可以了。