通常、可変高セルをサポートするための私のアプローチは、特定のモデル オブジェクトのサイズを計算できるクラス メソッドを定義することです。
+ (CGFloat)heightForBracket:(Bracket*)bracket;
クラス メソッドにする利点は、定数 (パディング値、フォント サイズ、インデント レベルなど) を他のクラスに公開することなく、実際にレイアウトを実装するコードと共有できることです。将来これらの定数を変更したい場合は、セル サブクラスの 1 か所だけを変更する必要があります。サブクラスの実装例:
#define kPaddingHorizontal 10.0
#define kPaddingVertical 10.0
#define kFontSizeName 17.0
+ (CGFloat)heightForBracket:(Bracket*)bracket {
// determine the dimensions of the name
UIFont *nameFont = [UIFont systemFontOfSize:kFontSizeName];
CGFloat nameSize = [bracket.name sizeWithFont:nameFont
constrainedToSize:CGSizeMake(300, CGFLOAT_MAX) // 300 is the width of your eventual label
lineBreakMode:NSLineBreakByWordWrapping];
// Apple recommends all cells be at least 44px tall, so we enforce a minimum here
return MAX(44, nameSize.height + 20 + kPaddingVertical*2); // 20 is space for the subtitle label
}
- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
if (self) {
// bracket name
self.textLabel.numberOfLines = 0; // 0 makes this variable height
self.textLabel.font = [UIFont systemFontOfSize:kFontSizeName];
self.textLabel.lineBreakMode = NSLineBreakByTruncatingTail;
self.textLabel.backgroundColor = [UIColor clearColor];
// if you wanted to hardcode a specific width, to a subview do it here as a constant and then share it with heightForBracket:
// bracket number
self.detailTextLabel.numberOfLines = 1;
self.detailTextLabel.font = [UIFont systemFontOfSize:14.0];
self.detailTextLabel.lineBreakMode = NSLineBreakByTruncatingTail;
self.detailTextLabel.backgroundColor = [UIColor clearColor];
}
return self;
}
- (void)setBracket:(Bracket*)bracket {
_bracket = bracket;
self.textLabel.text = bracket.name;
self.detailTextLabel.text = [NSString stringWithFormat:@"%@", bracket.bracketId];
}
heightForBracket:
その後、次のように呼び出すことができますtableView:heightForRowAtIndexPath:
。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
Bracket *bracket = [brackets objectAtIndex:indexPath.row];
return [BracketTableCell heightForBracket:bracket];
}
tableView:cellForRowAtIndexPath:
セルに適切なブラケットを設定するだけで、非常に簡単になります。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"BCell";
BracketTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[BracketTableCell alloc] initWithReuseIdentifier:CellIdentifier];
}
Bracket *bracket = [brackets objectAtIndex:indexPath.row];
cell.bracket = bracket;
return cell;
}
いくつかのメモ:
- これは、セルが自動レイアウトを使用していないことを前提としています
- これは、セル/ラベルの幅を明示的にハードコーディングします。これは、ユースケースに適合する場合と適合しない場合があります
- プロトコルに既に存在するメソッドである
description
ため、プロパティに名前を付けないでください。NSObject
heightForBracket:
他の拡張機能は、特に大量のサブビューのサイズ変更ロジックを開始する場合に、スクロールのパフォーマンスを向上させるために結果をキャッシュすることです