4

カスタムに問題がありますUITableView。省略記号「...」が表示されず、セルの最後でテキストが途切れることなく、テキストのグループをセルに適切に作成する方法について疑問に思っていました。

これは現在、私のセルがどのように見えるかです:

ここに画像の説明を入力

の一部ですUISplitViewController。これに関する問題は、何らかの理由でテキスト全体が表示される前に、セルの最後に到達し、残りの文字列が切り取られることです (これは、「AutoLayout」をチェックすると発生します)。

これは私のコードが現在どのように見えるかです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"BCell";

    BracketTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
    {
        cell = [[BracketTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        [cell.description setLineBreakMode:NSLineBreakByWordWrapping];
        cell.description.numberOfLines = 0;
        cell.description.font = [UIFont fontWithName:@"Helvetica" size:14.0];
    }

    Bracket *bracket = [brackets objectAtIndex:indexPath.row];

    [cell.description setText:bracket.name];
    [cell.bracketId setText:[NSString stringWithFormat:@"%@", bracket.bracketId]];    

    return cell;
}

高さを実験していますが、高さを何にでも設定できるので問題ないようですが、それでもテキストが切り捨てられます。

ありがとう!

4

4 に答える 4

1

通常、可変高セルをサポートするための私のアプローチは、特定のモデル オブジェクトのサイズを計算できるクラス メソッドを定義することです。

+ (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:他の拡張機能は、特に大量のサブビューのサイズ変更ロジックを開始する場合に、スクロールのパフォーマンスを向上させるために結果をキャッシュすることです
于 2013-05-05T04:24:33.310 に答える
0

問題はラベルの幅に関係していると思います。自動レイアウトを使用している場合は、ラベルの幅を拡張して親セルを埋め、スーパービューの制約に末尾と先頭を追加して、サイズが変更されるようにします。

于 2013-05-03T22:52:38.090 に答える
0

@gdubs カスタム UITableViewCells を使用できます

参考までに、UITableView のテーブル ビュー セルのカスタマイズを使用できます。

UILabels をカスタマイズするのは簡単だと思います。複数の行を追加してから設定TitletLabel.numberOfLines=0;したい場合や、ワードラッピングが必要な場合のようにTitleLabel.lineBreakMode=NSLineBreakByWordWrapping;。ワードラッピングには他のオプションもあります。

于 2013-04-29T17:39:51.100 に答える