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

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

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

(肖像)
(景观)

这就是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],其中容器是我的TableView,使用willRotatetoInterfaceOrientation和didRotatetoInterfaceOrientation无济于事.我也尝试将它放在viewDidLoad中,以便在景观模式下以正确的高度加载视图时检测并加载,但这也不起作用.对于iPhone,无论我做什么,它都会加载纵向视图的高度,并且不会在旋转时更新.

我发现了一些我认为可能会有帮助的问题,但我似乎无法让this answer为我工作,即使它看起来像我有同样的问题,而this one似乎更关注单元宽度而不是高度而且我’我不确定它是否以同样的方式适用.

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

This tutorial似乎对更改表高度有一些了解,所以我将begin / endUpdates代码添加到我的didRotatetoInterfaceOrientation中,认为这可能会导致更改,但这不起作用.

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

解决方法

看来你正在这里一个自动换行.根据我以前的经验,我建议你:

1)使用sizeWithFont或较新的iOS7版本以及适当的linebreakmode.

2)您可以为“opCell”实现layoutSubview,您可以在其中重新定义帧大小.

3)计算旋转期间的单元高度.确保根据新的tabelView Bounds正确设置宽度.

4)您还可以实现estimatedHeightForRowAtIndexPath以快速估计表重新加载操作的大小.

希望这可以帮助 !!

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...