6

我洒了

NSAssert(abs(self.frame.size.height-self.contentView.frame.size.height)<=1,@"Should be the same");

在创建要返回的 UITableViewCell 时的各个位置。

结果往往不同。有时是 1 个像素,有时是 2 个像素。

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

他们的开始是一样的。没有编辑等。

看看这个简单的片段

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 处于分组模式。我认为这与它有关。

4

1 回答 1

4

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

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

细胞的contentView“内部”是细胞。它的超级视图是单元格本身,其子视图具有自己的局部坐标系。这些不是由 tableView 操作的,而是由单元格(例如您的单元格子类)本身在其上设置的约束。您的子类可以实现layoutSubviews以按照contentView您想要的方式调整大小。

如果你想确保你的 contentView 与你的单元格的高度(和边界)匹配,在你的UITableViewCell子类中,layoutSubviews像这样实现:

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

contentView您可以对所需的框架进行任何修改,但请考虑使用超级视图bounds而不是frame.

于 2013-08-16T12:37:21.833 回答