在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]
并自行计算宽度?
答案 0 :(得分:8)
重新审视此问题后,我发现我无法再重现问题中描述的行为。现在的行为符合预期:
UITableViewCellAccessoryNone
accessoryView
属性返回nil
我现在正在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;
[...]
}