2011-08-15 7 views
2

アドレスセルには可変の高さが必要です。可変高さのUITableViewCellを描画するときに不正な幅を取得する

viewWillAppear私は、ラベルの高さを瓶の中に捉えるためのテストセルを描きます。

デリゲートメソッドtableView:heightForRowAtIndexPathでは、ivarを使用して実際のアドレスセルの高さを設定します。

コード:

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 

UITableViewCell *testCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:@"addressCell"] autorelease]; 

testCell.textLabel.text = @"Address"; 
testCell.detailTextLabel.text = [selectedPatient valueForKey:@"address"]; 
testCell.selectionStyle = UITableViewCellSelectionStyleNone; 
testCell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap; 
testCell.frame = CGRectMake(0,0,100,30); 
[testCell addSubview:testCell.detailTextLabel]; 
[testCell sizeToFit]; 

CGSize maxSize; 

// HERE is where the problem occurs 
// maxSize.width is 35 when it should be 200 
maxSize.width = testCell.detailTextLabel.frame.size.width; 
// 

maxSize.height = 500; 

UIFont *font = testCell.detailTextLabel.font; 

CGSize testSize = [[selectedPatient valueForKey:@"address"] sizeWithFont:font constrainedToSize:maxSize lineBreakMode:UILineBreakModeWordWrap]; 

addressLabelHeight = testSize.height; 

[testCell removeFromSuperview]; 
} 

テストセルの幅を取得するには問題があります。 NSLogの値がcellForRowAtIndexPath:の場合、幅は200になりますが、私のtestCellの幅は35にすぎません。これは、高さが大きすぎて余分な空白を持つセルを表示します。

maxSize.width = 200を設定するだけで問題は解決しましたが、detailLabelの幅を動的に取得するのは間違っていましたか?

答えて

2

maxSize.widthは、テキストの幅になります。 @"address"から得られるテキストは何ですか?私はそれが約35ポイントの幅で賭けている。

ところで、なぜあなたはこれをやっている:

// This is legal, but a strange size 
testCell.frame = CGRectMake(0,0,100,30); 

// This is redundant I believe 
[testCell addSubview:testCell.detailTextLabel]; 

// Does this help you at all? 
[testCell sizeToFit]; 

あなたは本当にtableView:willDisplayCell:atIndexPath:まで、セルの幅を信頼することはできません。これで、最終レイアウトをしたい場所です。あなたの目的のためには、おそらく住所をどのくらい広げたいか(あなたが好きなら200ポイント)を選んで、それをどれだけ大きくするのではなく、その幅にするべきでしょう。

+0

私はtableView:willDisplayCell:atIndexPathについて知らなかった。ありがとう!また、CGRectMakeでセルのフレームを作成せずに、寸法は0になります.Cocoaで描画するための優れたリソースをお勧めできますか? –

+0

初期の寸法に関しては、それはデフォルトフレームであるので、はい、CGRectZeroになります。発信者は何かを提供する必要があります。通常は、それがどれくらい広がっているかを知る唯一のものである 'UITableView'によって行われます。このようなレイアウトの問題については、「View Programming Guide」が必要です。実際の "描画"には、Cocoa Drawing Guideが必要です。 [iOS 5プログラミング:限界を押し込む](http://www.wiley.com/WileyCDA/WileyTitle/productCd-1119961327.html)は今年後半にリリースされる予定で、図面を最適化するために多くのページを費やしています。 –

関連する問題