自定义 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