2

UITableViewCellを含むサブクラスを作成しましたUITextView。のテキストUITextViewが設定されると、高さは増加するが幅は同じままになるように自動的にサイズ変更されます。

UITableViewCell以下に示すメソッドを使用して、その中の高さに基づいてそれぞれの高さを動的に設定したいと考えてUITextViewいます。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Some code to pull in the subclassed UITableViewCell & set 
    // the height based on the UITextView within it.
}

これが可能かどうか/方法について誰かがアドバイスできますか? 明確にするために、このメソッドからカスタムセルを取得して問題を引き起こしています。明らかにキャストすることはできますが、それは私には正しくないようです。誰かがこれを行う方法についてアドバイスできますか?

4

4 に答える 4

1

コンテンツが変更されるたびUITextViewに、関連するセルの高さを再計算して更新する必要があります。新しいセルの高さを設定するだけではなく、代わりにtableViewデリゲート メソッドを呼び出して確認する必要がありますtableView:heightForRowAtIndexPath:tableViewセル サイズの再計算を強制するには、empty [tableView beginUpdates]/ [tableView endUpdates]block を呼び出します。
私のTableKitライブラリには、この機能を示す ReminderSample デモがあります。

于 2013-01-26T21:51:01.827 に答える
1

正しい幅の UITextView を作成し、textview にテキストを設定します。コールし[textview sizeToFit]ます。テキストビューから高さを取得し、UITableViewCell サブクラス内にある場合と同等になるように必要な追加の高さを追加します。

NSString を使用するのsizeWithFont:constrainedToSize:lineBreakMode:はいいことですが、私の経験では、同じサイズの UITextView とは異なる場所で文字列が壊れることが多いため、信頼できません。あなたのテキストは、多くの場合、UITextView で NSString がsizeWithFont:constrainedToSize:lineBreakMode:提案するよりも多くの行または少ない行を必要とします。

于 2013-01-23T21:00:10.967 に答える
0

UITextViewに含まれる文字列に対して、NSStringのsizeWithFont:constrainedToSize:lineBreakMode:を使用します。返される高さに約15pxを追加して、余裕を持たせます。

于 2013-01-23T20:14:32.690 に答える
0

これは実際の例です。このアプリでは、3 番目のセクションの 1 つのセルのみがサイズ変更されます。任意のセルのサイズを変更する場合は、サイズ (私の例では descriptionLableSize) を NSMutableDictionary に保存し、それを使用する必要があります。tableView:cellForIndexPath:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *description = [self.modelObject valueForKey:@"descriptionText"];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);

    //if needed save the size in a dictionary for each indexPath
    descriptionLableSize = [description sizeWithFont:[UIFont fontWithName:@"Helvetica" size:17] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
    if (indexPath.section == 2){
        NSUInteger h = descriptionLableSize.height + 20;
        h = (h < 44) ? 44:h;
        return h;
    }
    return 44.0;
}



-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    //....
    if (section == 2) {

        NSString *description = [self.modelObject valueForKey:@"descriptionText"];
        cell.textLabel.text = description;
        [cell.textLabel setNumberOfLines:0];
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;

    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;

}
于 2013-01-26T13:15:28.467 に答える