2013-04-02 9 views
6

返すためのUITableViewCellを作成するときに、私は、様々な場所になぜself.frameとself.contentView.frameはUITableViewCellで異なるのですか?

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

を振りかけました。

多くの場合、結果が異なります。場合によっては1ピクセルで、時には2で表示されます。

問題は何ですか?それらを異なるものにするcellForRowAtIndexPathにsometingがありますか?

これらは同じです。何の編集など

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. 

しかし、この単純なsnipetで

ルックはありませんが、それは私が、細胞が時々後者のデキュー後に失敗しました。

これは結果

(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

2つの長方形は異なる座標系にあり、必ずしも一致するとは限りません。

cell.frameは、スーパービューの座標系(cell.superview)のセルの矩形を指します。セルのスーパービューはUITableViewです。セルのフレームは、適切に配置するためにテーブルビューで操作されます。これには、rowHeightプロパティまたはtableView:heightForRowAtIndexPath:デリゲートメソッドによって返された値に一致する高さを変更することも含まれます。

細胞のcontentViewは、細胞の「内側」にある。スーパービューは、サブビューのための独自のローカル座標系を持つセル自体です。これらはtableViewによって操作されるのではなく、セル(セルのサブクラスなど)自体によって設定された制約によって決まります。 contentViewのサイズを変更するには、サブクラスでlayoutSubviewsを実装することがあります。

あなたのcontentView高さ(との境界)と一致するようにしたい場合は、あなたの細胞の、あなたのUITableViewCellサブクラスで、そのようlayoutSubviewsを実装:

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

あなたがいることをcontentViewフレームへの変更を行うことができますこれらは、frameではなく、スーパービューのboundsを使用してローカル座標系に対して行う必要があると考えてください。

+0

Mark、セル幅とセルのcontentView幅が同じではない理由を説明してください。 –

関連する問題