在iOS 7中重新计算旋转时的子视图大小

Gen*_*ike 5 objective-c uipopovercontroller ios ios7

我有一个方法,我打电话来计算我在一个自定义UITableViewCell子类中的一堆标签的大小,它在一个UIPopoverController.当用户旋转设备时,我需要重新计算尺寸,然后重新绘制表格以使用新尺寸.我尝试检测旋转的每个方法都是折旧的,不会被调用,或者在正确的时间没有被调用.是否有一种方法会在旋转设备时自动调用,我可以重新计算我的尺寸?


编辑:我尝试了什么,为什么它不起作用:

  • shouldAutorotate - 没有被称为 - 显然是贬值.
  • layoutSubviews- 被召唤,但如果我试着进入[self.tableView reloadData]这里,我会陷入无限循环
  • NSNotificationCenterobserver for UIDeviceOrientationDidChangeNotification- 在我的控制器知道它的新尺寸之前调用,所以我不能在这里重新计算我的尺寸
  • [self.tableView setNeedsDisplay]in layoutSubviews- 不提示重新绘制表格.
  • didRotateFromInterfaceOrientation - 没有被称为 - 显然是贬值.

编辑2:关于我正在尝试做的更多细节

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

Joh*_*rug 1

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

  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: