8

一旦设备旋转,我怎样才能让我的单元格重绘?

当我在 iPhone 上进行测试时,默认方向是纵向,所以当设备处于纵向时,我的动态单元格的高度与它们需要的一样高:这意味着当我旋转到横向时,屏幕上有很多空白空间细胞。当我在 iPad 上测试时,情况正好相反。旋转到纵向时,我的部分文本被截断,因为默认值为横向。我有两个设备的单独故事板,两个视图控制器都设置为“方向:推断”

在此处输入图像描述(纵向) 在此处输入图像描述(横向)

这就是 iPhone 上发生的情况 - 拉伸标签具有深红色背景,因此您可以看到标签的实际大小。但是,单元格高度不会重新计算,并且由于底部标签被限制在单元格的底部,因此它们一直位于底部。如果我从拉伸标签(带有背景的标签)添加一个约束到单元格的底部,它所做的就是像这样拉伸标签:

在此处输入图像描述(标签被拉伸)

这告诉我的是,现在我无法让单元格知道方向是什么,并在它更改为适合时重新绘制。这是我heightForRowAtIndexPath计算单元格高度的代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.opCell)
        {
            self.opCell = [self.container dequeueReusableCellWithIdentifier:@"OPCell"];
        }
    self.opCell.opName.text = [[self.data objectAtIndex:indexPath.row] valueForKey:@"name"];
    [self.opCell layoutIfNeeded];
    CGFloat height = [self.opCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    return height + 1;
}

到目前为止,为了让它旋转,我已经尝试过[self.container reloadData],容器是我TableViewwillRotateToInterfaceOrientationdidRotateToInterfaceOrientation但无济于事。我还尝试将它放在 viewDidLoad 中,以便在以正确高度以横向模式加载视图时检测并加载,但这也不起作用。对于 iPhone,无论我做什么,它都会加载纵向视图的高度并且不会在旋转时更新。

我发现了一些我认为可能会有所帮助的问题,但我似乎无法让这个答案对我有用,即使这似乎与我的问题相同,而且这个问题似乎更关注单元格宽度而不是高度和我不确定它是否以同样的方式适用。

甚至是一个教程,当我在 iPhone 上运行它时,它也没有在旋转时调整 TableViewCells 的大小。

本教程似乎对更改表格高度有所了解,因此我将begin/endUpdates代码添加到我的didRotateToInterfaceOrientation中,认为这可能会导致更改,但这并没有奏效。

因此,如果有人有任何建议或知道解决方案,将不胜感激,因为我正在用这个撞砖墙!

4

3 回答 3

1

看来你在这里做一个自动换行。因此,根据我之前的经验,我建议您:
1)使用 sizeWithFont 或具有适当换行模式的较新 iOS7 版本。
2)您可以为您的“opCell”实现layoutSubview,您可以在其中重新定义帧大小。
3) 计算旋转过程中的单元格高度。确保根据新的 tabelView Bounds 正确设置宽度。
4)您还可以实现estimatedHeightForRowAtIndexPath 以快速估计表重新加载操作的大小。

希望这可以帮助 !!

于 2014-07-14T19:40:42.603 回答
0

所以我想出了我的问题。按照本教程,我发现我失踪了。

我不得不:

  1. 子类化我正在拉伸的标签和preferredMaxLayout满足屏幕宽度的状态

  2. 在我的heightForRowAtIndexPath我需要告诉单元格获取和更新屏幕的当前宽度

有关更多详细信息,请参阅教程。希望这个问题和答案对将来的人有所帮助,因为这非常麻烦。

于 2014-07-23T16:34:20.907 回答
-1

您可以使用与此处相同的技巧。那就是调用:

[tableView beginUpdates];
[tableView endUpdates];

中间没有任何东西。这将触发表格视图的高度重新计算。

于 2014-07-10T01:16:52.860 回答