6

在我覆盖的 UITableViewCell 子类中,layoutSubviews因为我需要计算几个子视图的帧。我所有计算的基础是内容视图的宽度。这就是我开始实施的layoutSubviews样子:

- (void) layoutSubviews
{
  [super layoutSubviews];  // invoke this to set up the content view's bounds

  CGFloat contentViewWidth = self.contentView.bounds.size.width;

  [...]  // calculate and assign frames to subviews
}

我已经开始在 iPhone 模拟器的分组表视图中对此进行测试。单元格应该只包含内容视图中的内容,即我已经关闭了所有周围的花哨的东西。具体来说,我通过将附件类型设置为 来禁用附件视图UITableViewCellAccessoryNone。由于这个原因,附件视图被隐藏了,尽管它的边界/框架属性仍然报告了 20/20 的大小。

基于所有这些,以及下面的简单说明,我希望上述代码片段中的内容视图宽度报告为 300。

<----------- screen width = 320 ----------->
+------------------------------------------+
|                                          |
|    <--- content view width = 300 --->    |
|    +--------------------------------+    |
|<-->|         table view cell        |<-->|
| 10 +--------------------------------+ 10 |
|                                          |
|                  [...]                   |

但事实并非如此,实际报出的内容视图宽度是270!

一些研究表明,这 30 个缺失点包括 a)附件视图的 20 个宽度,以及 b)内容视图和附件视图之间的 10 个间距。我尝试将附件视图大小设置为 0/0,效果是内容视图宽度现在报告为 290。稍微好一点,但仍然相差 10 分。我也尝试将accessoryView属性设置为nil,但视图只是由[super layoutSubviews].

最后,问题是:有没有办法真正禁用附件视图,使其不包含在内容视图宽度的计算中?或者,跳过调用[super layoutSubviews]并简单地自己计算宽度是否安全?

4

1 回答 1

10

重新审视这个问题后,我发现我无法再重现问题中描述的行为。现在的行为符合预期:

  • 表格视图单元格的默认附件样式是UITableViewCellAccessoryNone
  • 财产accessoryView归还nil
  • 内容视图宽度报告为 302

我现在在 iPhone 5.1 模拟器上的 Xcode 4.2 中对此进行测试。当我问这个问题时,我相信我仍然在运行 iPhone 4.3 模拟器。我现在必须假设该问题仅存在于 4.3 模拟器中,或者是由于我的某些 Xcode 配置错误,或者一开始完全是虚构的。

作为记录:我的解决方法是在内容视图中应用一个新宽度layoutSubviews

- (void) layoutSubviews
{
  [super layoutSubviews];

  CGRect contentViewFrame = self.contentView.frame;
  contentViewFrame.size.width = 302;
  self.contentView.frame = contentViewFrame;

  [...]
}
于 2012-12-23T21:44:36.343 回答