19

だから、heightForRowAtIndexPath前に呼ばれているようですcellForRowAtIndexPath。私は現在cellForRowAtIndexPath、各セルの高さを計算するために使用しています(これらは可変の高さでありUILabel、さまざまな量のテキストが含まれています。

高さを設定するメソッドが、セルを計算するメソッドの前に呼び出された場合に、セルの高さを正しく設定する方法に戸惑います。

NSStringのカテゴリと別のカテゴリを作成しました。UILabelこれらを組み合わせることでUILabel、適切なサイズになります。問題は、UITableViewCellこれらのラベルを含むインスタンスのサイズが変更されていないため、ラベルが各ラベルの端にぶら下がって、下のラベルと重なっていることです。

セルの高さをラベルの高さに等しくし、さらにマージンスペースを追加する必要があることはわかっていますが、ラベルの高さを計算する前に高さを設定する方法に戸惑っています。使用せずに誰かの身長を設定できますheightForRowAtIndexPathか?または、そうでない場合は、他の場所でセルの高さを計算できますか?私は現在indexPath.rowそれを実現するために使用しているので、事前にそれを行うのは難しいでしょう。これが私のcellForRowAtIndexPathのコードです:

cellForRowAtIndexPath

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
    FQCustomCell *_customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"];
    if (_customCell == nil) {
        _customCell = [[FQCustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"];
    }

    _customCell.myLabel.text = [[_loadedNames objectAtIndex: indexPath.row] name];
    _customCell.myLabel.font = [UIFont fontWithName: @"FontA" size: 15.0f];

    UIView *backView = [[UIView alloc] initWithFrame: CGRectZero];
    backView.backgroundColor = [UIColor clearColor];
    _customCell.backgroundView = backView;

    _customCell.myLabel.frame = CGRectMake(5, 5, 265, 65);

    [_customCell.myLabel sizeToFitMultipleLines];
    return _customCell;
}
4

3 に答える 3

15

のセルの高さを計算する必要がありますheightForRowAtIndexPath

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *theText=[[_loadedNames objectAtIndex: indexPath.row] name];
    CGSize labelSize = [theText sizeWithFont:[UIFont fontWithName: @"FontA" size: 15.0f] constrainedToSize:kLabelFrameMaxSize];
    return kHeightWithoutLabel+labelSize.height;
}

を設定することにより、ラベルサイズにいくつかの制約を設定できますkLabelFrameMaxSize

#define kLabelFrameMaxSize CGSizeMake(265.0, 200.0)

次に、可変ラベル高さで一定の高さを追加して高さを返します。

cellForRowAtIndexPathまた、一貫性を保つために、使用する代わりに、同じ方法を使用してフレームを設定する必要がありますsizeToFitMultipleLines

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
    FQCustomCell *_customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"];
    if (_customCell == nil) {
        _customCell = [[FQCustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"];
    }

    _customCell.myLabel.text = [[_loadedNames objectAtIndex: indexPath.row] name];
    _customCell.myLabel.font = [UIFont fontWithName: @"FontA" size: 15.0f];

    UIView *backView = [[UIView alloc] initWithFrame: CGRectZero];
    backView.backgroundColor = [UIColor clearColor];
    _customCell.backgroundView = backView;

    CGSize labelSize = [_customCell.myLabel.text sizeWithFont:_customCell.myLabel.font constrainedToSize:kLabelFrameMaxSize];
    _customCell.myLabel.frame = CGRectMake(5, 5, labelSize.width, labelSize.height);

    return _customCell;
}
于 2013-02-19T11:27:56.907 に答える
1

heightForRowAtIndexPathメソッドでセルの高さを計算する必要があります。heightForRowAtIndexPathJP Hribovsekの回答の実装と同じように、UILabelを使用せずに実行する必要があります。

次に、サブビューのフレームを設定したり、ラベルのメソッドをcellForRowAtIndexPath呼び出したりしないでください。sizeToFitMultipleLines代わりに、セルの可能な境界に対してサブビューフレームが正しく設定されるようなlayoutSubviewsメソッドを実装します。FQCustomCellこの方法では、テキストやフォントのサイズを気にする必要はありません。ラベルの余白が正しいことを確認してください。セルの高さがメソッドで正しく計算されている場合、heightForRowAtIndexPathラベルのサイズはちょうどいいでしょう。

于 2013-02-19T15:30:46.467 に答える
-2

すべてのセルに対して、heightforRowAtIndexPathが最初に呼び出され、次にCellForRowAtIndexPathが呼び出されます。したがって、最初に高さを計算してから、すべてのセルのCellForRowAtIndexPathにデータを入力できます。

于 2013-02-19T11:32:13.143 に答える