5

我调用了一个方法来计算我在自定义UITableViewCell子类中拥有的一堆标签的大小,该子类位于UIPopoverController. 当用户旋转设备时,我需要重新计算尺寸,然后重新绘制表格以使用新尺寸。我尝试检测旋转的每种方法要么被贬值,要么没有被调用,或者没有在正确的时间被调用。是否有一种方法可以在设备旋转时自动调用,我可以重新计算我的尺寸?


编辑:我尝试过的以及为什么它不起作用:

  • shouldAutorotate- 没有被调用 - 显然已经贬值了。
  • layoutSubviews- 被调用,但如果我尝试[self.tableView reloadData]在这里,我会陷入无限循环
  • NSNotificationCenter观察者UIDeviceOrientationDidChangeNotification- 在我的控制器知道它是新尺寸之前被调用,所以我无法在这里重新计算我的尺寸
  • [self.tableView setNeedsDisplay]in layoutSubviews- 不提示重新绘制表格。
  • didRotateFromInterfaceOrientation- 没有被调用 - 显然已经贬值了。

编辑 2:有关我正在尝试做的事情的更多详细信息

我正在尝试模仿“行和列”样式表,并排列标签以模仿列。当我重新计算大小时,我会遍历表格的所有行,然后遍历该行中的每个“列”。我得到每列的宽度,并跟踪每列的所有行中的最大宽度。然后我操纵宽度和字体大小之间的间距来获取它,这样如果任何行在每一列中都有最宽的标签,它仍然可以在屏幕上显示。

4

3 回答 3

1

您不想依赖单元格内实际渲染的 UILabel 来计算“列”宽度。改为这样做:

  1. 实现一个名为的方法,该方法calculateColumnWidthsForInterfaceOrientation:需要一个UIInterfaceOrientation. 在该方法中,使用 . 检查请求的方向是纵向还是横向UIInterfaceOrientationIsLandscape(orientation)。然后,根据方向浏览要在标签中显示的数据,并使用 NSString 的sizeWithAttributes:方法(或其派生方法之一)找到最宽的列宽。将这些值缓存在数组或其他东西中。
  2. 向您的自定义表格视图单元格添加一个方法,该方法setColumnWidths:采用所需的列宽。
  3. 在您的tableView:cellForRowAtIndexPath:方法中,检索缓存的列宽并使用该setColumnWidths:方法将其设置在单元格上。
  4. 在您的单元格中,使用您刚刚设置的列宽来布局标签。
  5. 在您的视图控制器中,实现didRotateFromInterfaceOrientation:. 在其中,calculateColumnWidthsForInterfaceOrientation:以给定的方向调用,然后调用[self.tableView reloadData]
  6. 最后,在第一次轮换之前viewDidLoad调用[self calculateColumnWidthsForInterfaceOrientation:self.interfaceOrientation]以对数据进行初始设置。

这应该够了吧。

更新: 你的单元格的总宽度应该等于你的表格视图的总宽度。这可以通过自动布局或其他方式进行管理。该大小将反映在单元格的框架大小中。

更新 2: 由于我们正在讨论popover,您可以简单地关闭 popover ,willRotateToInterfaceOrientation:duration:然后在旋转完成后以新的所需尺寸再次显示它didRotateFromInterfaceOrientation:

于 2013-10-25T17:33:20.433 回答
1

在 layoutSubviews 中尝试重新计算子视图一个单元格

例如在 CustomCell.m

- (void)layoutSubviews
{

UIViewController *viewController = (id)[(AppDelegate *)[UIApplication sharedApplication].delegate window].rootViewController;

if (UIInterfaceOrientationIsPortrait(viewController.interfaceOrientation))
    self.backgroundColor = [UIColor redColor];
else
    self.backgroundColor = [UIColor greenColor];

}

于 2013-10-25T17:40:48.613 回答
0

您是否考虑过使用自动布局来定义您的 tableView 和单元格?结合使用适当的约束updateConstraints来更新设备旋转时的单元格布局应该会有所帮助。使用这种方法,您可以设置preferredMaxLayoutWidth每个“列”标签的标签并定义约束以处理适当的水平填充,而不考虑方向。

此外,如果使用 iOS 7,那么您应该实现popoverController:willRepositionPopoverToRect:inView:在旋转时处理子视图的布局,除非您从条形按钮项目中呈现弹出框。我建议查看UIPopoverController 类参考

于 2013-10-25T19:17:55.317 回答