自定义 UITableViewCell 中的 contentView 宽度错误?

Posted

技术标签:

【中文标题】自定义 UITableViewCell 中的 contentView 宽度错误?【英文标题】:Wrong contentView width in custom UITableViewCell? 【发布时间】:2012-11-05 00:40:56 【问题描述】:

在 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 的大小。

基于这一切,以及下面的简单说明,我希望上面代码 sn-p 中的内容视图宽度报告为 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] 并简单地自己计算宽度是否安全?

【问题讨论】:

不是一个解决方案,但如果你忽略在这里调用 super ,你会在分组表视图中丢失弯曲的单元格角,所以这不是一个选项 layoutSubviews 可能会在单元格最终出现在表格中之前被调用几次。您是否为最终通话验证了 contentView 的大小,还是只查看初始通话? @rmaddy:在我的测试用例中,UIKit 只调用了一次layoutSubviews 【参考方案1】:

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

表格视图单元格的默认附件样式为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;

  [...]

【讨论】:

以上是关于自定义 UITableViewCell 中的 contentView 宽度错误?的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 中的 UIPickerView

自定义 UITableViewCell 中的 UIImageview 未正确显示

自定义 uitableviewcell 中的 Uibuttons

自定义 uitableviewcell 中的 uiscrollview

UITableVIewCell 重叠图像中的自定义按钮

更改 uitableviewcell 中的自定义附件视图?