gpt4 book ai didi

objective-c - 为什么 self.frame 和 self.contentView.frame 对于 UITableViewCell 经常不同?

转载 作者:太空狗 更新时间:2023-10-30 03:44:32 24 4
gpt4 key购买 nike

我洒了

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

最佳答案

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

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

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

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

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

您可以根据需要对 contentView 框架进行任何修改,但考虑到这些应该使用父 View 的 bounds 而不是相对于局部坐标系来完成框架

关于objective-c - 为什么 self.frame 和 self.contentView.frame 对于 UITableViewCell 经常不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15755462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com