ストーリーボードのコンテンツを指定するために「動的プロトタイプ」を使用する場合UITableView
、カスタムに設定できる「行の高さ」プロパティがあります。
セルをインスタンス化する場合、このカスタム行の高さは考慮されません。使用するプロトタイプセルは、セルをインスタンス化するときのアプリケーションコードによって決定されるため、これは理にかなっています。レイアウトを計算するときにすべてのセルをインスタンス化すると、パフォーマンスが低下するため、それができない理由を理解しています。
次に、セル再利用識別子を指定して高さを取得できますか?
[myTableView heightForCellWithReuseIdentifier:@"MyCellPrototype"];
またはその線に沿って何か?または、アプリケーションコードで明示的な行の高さを複製する必要がありますが、それに続くメンテナンスの負担がありますか?
@TimothyMooseの助けを借りて解決しました:
高さはセル自体に保存されます。つまり、高さを取得する唯一の方法は、プロトタイプをインスタンス化することです。これを行う1つの方法は、通常のセルコールバックメソッドの外部でセルを事前にデキューすることです。これが私の小さなPOCで、機能します。
#import "ViewController.h"
@interface ViewController () {
NSDictionary* heights;
}
@end
@implementation ViewController
- (NSString*) _reusableIdentifierForIndexPath:(NSIndexPath *)indexPath
{
return [NSString stringWithFormat:@"C%d", indexPath.row];
}
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(!heights) {
NSMutableDictionary* hts = [NSMutableDictionary dictionary];
for(NSString* reusableIdentifier in [NSArray arrayWithObjects:@"C0", @"C1", @"C2", nil]) {
CGFloat height = [[tableView dequeueReusableCellWithIdentifier:reusableIdentifier] bounds].size.height;
hts[reusableIdentifier] = [NSNumber numberWithFloat:height];
}
heights = [hts copy];
}
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
return [heights[prototype] floatValue];
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:prototype];
return cell;
}
@end