0

I have looked at several questions asking to adjust row height based on cell content. But in my case, I have 10 labels in one cell and each label has fixed width. Labels must wrap the text if not fit to label width. So row height depends on all 10 label's text content. That means I have to calculate height of every label for given text and take maximum height amongst all labels as row height. I have to do this for all rows. This looks to me an insufficient solution. Is there any better solution?

Thanks,

Jignesh

4

2 に答える 2

2

セルを表示する前に、すべての高さを計算する必要があります。その後、次を使用して各行の行の高さを返します。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

テキストサイズを計算するには、次を使用します。

[yourString sizeWithFont:constrainedToSize:lineBreakMode:]
于 2013-05-09T14:54:44.910 に答える
1

テーブル セルにカスタムの高さを設定するには、を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 による動的な高さ

于 2013-05-09T15:17:29.723 に答える