【发布时间】: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。
标签: ios uitableview