テーブル セルにカスタムの高さを設定するには、をUITableView
実装する必要があります。heightForRowAtIndexPath
これはUITableView
、データがリロードされるたびにテーブルの高さの合計が計算されるためです。データが静的な場合は、行の高さの計算もキャッシュすることができます。
あなたの場合、10 個のラベルすべてに相当するテキストを表すデータ モデル クラスを作成し、そのデータ モデル クラスで呼び出すことができるヘルパー関数を提供することをお勧めしますheightForRowAtIndexPath
。ヘルパー関数は、おそらく次のような行の高さの計算をカプセル化します。
行のデータを表すデータモデルクラスにこれがあるとしましょう:
@interface MyDataModelClass : NSObject
@property (strong, nonatomic) NSString *label1Text;
@property (strong, nonatomic) NSString *label2Text;
// ... etc
- (CGFloat)calculateLabelHeight;
@end
次に、calculateLabelHeight
メソッドは次のようになります (これは単なる疑似コードです)。
- (CGFloat)calculateLabelHeight {
CGFloat totalHeight = 0.0;
// Loop through your label texts calculating the variable sized height for each
// and adding some padding in between:
CGSize variableSize1 = [self.label1Text sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:CGSizeMake(300, 400) lineBreakMode:NSLineBreakByWordWrapping];
CGSize variableSize2 = [self.label2Text sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:CGSizeMake(300, 400) lineBreakMode:NSLineBreakByWordWrapping];
totalHeight = variableSize1 + padding + variableSize2 + padding; // and so on for all your labels.
return totalHeight;
}
次に、heightForRowAtIndexPath
これを行うことができます:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
MyDataModelClass *modelObject = [self.data objectAtIndex:indexPath.row];
// Assuming model object's label text properties have been set you can do this:
return modelObject.calculateLabelHeight;
}
1 つのラベルに長い文字列が含まれている可能性があり、2 番目のラベルが折り返されてオーバーレイされる可能性があることに気付きました。UITableViewCell
また、各ラベル テキストの高さがわかった後で、呼び出されるサブクラスにメソッドを追加するrepositionLabels
か、これを実行する何かを追加することもできます。
残念ながら、これがセルの高さを計算する唯一の方法だと思います。詳細については、この SO 投稿を参照してください。
IOS: カスタムの uitableviewcell による動的な高さ