iOS - 重绘具有动态单元格高度的TableViewCells旋转

时间:2014-07-07 22:15:07

标签: ios objective-c autolayout tableviewcell heightforrowatindexpath

旋转设备后,如何让细胞重绘?

当我在iPhone上测试时,默认方向是纵向,因此我的动态单元格与设备处于纵向方向时所需的一样高:这意味着当我旋转到横向时,会有很多空的细胞中的空间。当我在iPad上测试时,情况正好相反。旋转到纵向时,我的部分文字会被切断,因为默认为横向。我为这两个设备分别设置了故事板,并且两个视图控制器都设置为" Orientation:Inferred"

enter image description here(肖像) enter image description here(风景)

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

enter image description here(标签被拉伸)

这告诉我的是,现在我只是无法让单元格知道方向是什么,并且一旦它变得合适就重绘。这是我的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],其中容器是我的TableView willRotateToInterfaceOrientationdidRotateToInterfaceOrientation无济于事。我也尝试将它放在viewDidLoad中,以便在景观模式下以正确的高度加载视图时检测和加载,但这也没有用。对于iPhone,无论我做什么,它都会加载纵向视图的高度,并且不会在旋转时更新。

我发现了一些我认为可能会有帮助的问题,但我似乎无法让this answer为我工作,即使它看起来像我有同样的问题,{{3}似乎更多地关注单元格宽度而不是高度,我不确定它是否以相同的方式应用。

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

Here似乎对更改表格高度有一些了解,因此我将begin/endUpdates代码添加到我的didRotateToInterfaceOrientation中,认为这可能会导致更改,但这并没有也工作。

所以,如果有人有任何建议或知道解决方案,我将非常感激,因为我正在用这个打砖墙!

3 个答案:

答案 0 :(得分:1)

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

希望这会有所帮助!!

答案 1 :(得分:0)

所以我想出了我的问题。在this tutorial之后我发现我失踪了。

我必须:

  1. 我的标签正在拉伸并指出preferredMaxLayout符合屏幕宽度

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

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

答案 2 :(得分:-1)

您可以使用与here相同的技巧。那是在呼唤:

[tableView beginUpdates];
[tableView endUpdates];

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

相关问题