为什么self.frame和self.contentView.frame经常因UITableViewCell而不同?

时间:2013-04-02 03:15:56

标签: objective-c xcode4.5

我撒了

NSAssert(abs(self.frame.size.height-self.contentView.frame.size.height)<=1,@"Should be the same");
在创建要返回的UITableViewCell的各个地方

结果经常不同。有时候是1个像素,有时是2个。

我想知道问题是什么?在cellForRowAtIndexPath中是否存在使它们不同的东西?

他们开始相同。没有编辑等。

看看这个简单的snipet

BGDetailTableViewCell * cell= (BGDetailTableViewCell*)[tableView dequeueReusableCellWithIdentifier:[BGDetailTableViewCell reuseIdentifier]];

if (cell==nil)
{
    cell = [[BGDetailTableViewCell alloc]init];
}
else
{
    NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same"); //Sometimes this fail
}

NSOrderedSet *Reviews = [self.businessDetailed mutableOrderedSetValueForKey:footer.relationshipKey];
Review * theReview = [Reviews objectAtIndex:row];
cell.theReview = theReview;
NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same");//This one never fail right before returning cell
return cell;



`NSAssert(abs(cell.frame.size.height-cell.contentView.frame.size.height)<=1,@"Should be the same")`; never fails right before returning the cell.

然而,在我有时将细胞出列后,它失败了。

这是结果

(lldb) po cell
$0 = 0x0c0f0ae0 <BGDetailTableViewCell: 0xc0f0ae0; baseClass = UITableViewCell; frame = (0 424; 320 91); hidden = YES; autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0xc01e800>>
(lldb) po cell.contentView
$1 = 0x0c086080 <UITableViewCellContentView: 0xc086080; frame = (10 1; 300 89); gestureRecognizers = <NSArray: 0xc0c7ee0>; layer = <CALayer: 0xc0ebbf0>>

顺便说一句,tableView处于分组模式。我认为这与它有关。

1 个答案:

答案 0 :(得分:4)

两个矩形在不同的坐标系中,不一定匹配。

cell.frame在超视图的坐标系(cell.superview)中引用单元格的rect。单元格的superview是UITableView。单元格的框架将由表格视图操纵,以便正确布局。这还包括修改高度以匹配其rowHeight属性或tableView:heightForRowAtIndexPath:委托方法返回的值。

单元格的contentView位于单元格的“内部”。它的superview是单元本身,它的子视图有自己的局部坐标系。这些不是由tableView操纵的,而是由单元格(例如您的单元子类)本身设置的约束。您的子类可以实现layoutSubviews,以便按照您希望的方式调整contentView的大小。

如果您想确保您的contentView与您的单元格的高度(和边界)匹配,请在UITableViewCell子类中实现layoutSubviews,如下所示:

-(void)layoutSubviews
{
    self.contentView.frame = self.bounds;
}

您可以对所需的contentView框架进行任何修改,但请考虑使用superview的bounds代替frame对局部坐标系进行修改。