4

セルの高さが表されているテキストに応じて動的に定義されるテーブル ビューがあります。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //getting my text for this cell, the row etc ...
    ...
    //here is the part interesting us
    NSAttributedString* theText = [myTextForThisCell objectAtIndex:indexPath.row];

    NSInteger labelWidth = self.tableView.bounds.size.width-HORIZONTAL_CELL_PADDING;

    CGSize textSize = [theText sizeWithFont:[UIFont systemFontOfSize:customFontSize] constrainedToSize:CGSizeMake(labelWidth, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];

    return textSize.height+VERTICAL_CELL_PADDING;
}

わかりましたので、今私の問題です。テーブルビューは、plist ファイルをスキャンした後に特定の文字列を含む行を表示する検索アクションの結果です。

今まではそれでした。しかし、iOS 6 と NSAttributedString を使用すると、文字列の一部を簡単に太字にすることができるので、検索語を太字にすることにしました。

それは機能しており、必要な単語を太字にしていますが、sizeWithFont が NSString を要求するため、セルの高さを計算できなくなりました。また、太字は幅が広いため、属性のない文字列でセルの高さを単純に計算することはできません。

私はただここで立ち往生しています。

誰でも私を助けることができますか?

4

1 に答える 1

23

実際、NSAttributedText の Apple ドキュメントを読むだけで済みました。

私の場合、コードの最後の 2 行を次のように置き換える必要があります。

CGRect rectSize = [theText boundingRectWithSize:CGSizeMake(labelWidth, MAXFLOAT) 
                         options:NSStringDrawingUsesLineFragmentOrigin context:NULL];

return rectSize.size.height+VERTICAL_CELL_PADDING;

iOS 7 のフォローアップ

属性付きテキストを使用して iOS7 でこの作業を行うのに苦労しています。

Appleのドキュメントによると

iOS 7 以降では、このメソッドは分数のサイズを返します (返された CGRect のサイズ コンポーネントで)。返されたサイズをビューのサイズに使用するには、ceil 関数を使用してその値を最も近い整数に上げる必要があります。

どちらの方法も明らかに私にとってはうまくいきません! 私にとっての解決策は、高さの上限に +1 を追加することでした。これはおそらく Apple のバグですが、私にとってはすべて iOS6 と同じように動作します。

CGRect rectSize = [theAttributedText boundingRectWithSize:CGSizeMake(labelWidth, MAXFLOAT) 
                          options:NSStringDrawingUsesLineFragmentOrigin context:NULL];

return ceil(rectSize.size.height) + 1 + VERTICAL_CELL_PADDING;
于 2012-11-16T10:44:37.580 に答える