我撒了
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处于分组模式。我认为这与它有关。
答案 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
对局部坐标系进行修改。