在方向变化时更改UITableViewCell的高度

11

我有一个包含可变高度UILabel的UITableView。我能使用sizeWithFont:constrainedToSize:lineBreakMode:计算标签所需的最小高度,当表视图首次加载时可以正常工作。但是当我旋转表视图时,单元格变得更宽(意味着需要较少的行来显示内容)。是否有任何方法让UITableView在方向更改动画期间或立即在其前后重新确定单元格的高度?谢谢。


你如何获取sizeWithFont:constrainedToSize:lineBreakMode:中使用的大小(宽度)?我正在尝试创建一个可变高度的单元格,适用于普通和分组表视图样式,但无法弄清楚如何获取分组表视图的宽度。 - flagg19
2个回答

13

您的UITableViewController可以实现tableView:heightForRowAtIndexPath:方法来指定特定行的行高,并且可以查看当前方向([[UIDevice currentDevice] orientation])来决定返回什么高度。

为了确保tableView:heightForRowAtIndexPath:在方向更改时再次被调用,您可能需要检测方向更改,如此问题所述,并调用[tableView reloadData]


我目前已经实现了 tableView:heightForRowAtIndexPath:,我没有看到它在方向改变时被调用,但是它会在 reloadData 时被调用,我可以检测到方向的改变。如果可能的话,我希望高度能够随着视图旋转而动画化,但我并没有看到这种可能性。 - Peter Zich
3
根据这个问题:https://dev59.com/wnRB5IYBdhLWcg3w77on,你可以尝试使用 beginUpdates/endUpdates 来执行动画,而不是使用 reloadData - David Gelhar
1
非常好,David,谢谢你。我把这段代码放在-didRotateFromInterfaceOrientation里面,它运行得很好。现在它会旋转然后调整大小。我将寻找更好的方法来实现它,并尝试让它在旋转时自动调整大小。 - Peter Zich

12

对于上面@David的回答进行略微改进,并回答最后一条评论关于如何在旋转期间平滑地动画化它,使用以下方法:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

当然还有高度委托方法:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) {
        return 171.0f;
    } else {
        return 128.0f;
    }
}

谢谢!我都快发疯了!你有什么想法,为什么在初始应用程序时 statusBarOrientation 起作用,而单独使用 orientation 却不起作用?一旦运行并更改方向,两者都可以正常工作。 - Jan
UIDevice的方向和UIInterface的方向(从状态栏中)不同。UIDevice可能处于UIDeviceOrientationFaceUp(例如,您的iPad平放在桌子上),这并不能告诉您界面的方向,它可以是4个方向中的任何一个。 - bandejapaisa

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