web-dev-qa-db-ja.com

UITableViewCell、動的な高さのUITextView

たくさんのテキストを保持するUITableViewCellを作成する必要があります。セルにUITextViewを追加できることはわかっていますが、各エントリに同じ量のテキストが含まれるわけではありません。

UITableViewCellの高さを-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPathで制御できることはわかっていますが、それは私が探しているものではありません。

シナリオ1:

 ---------------
| First Cell    |
 ---------------
 ---------------
| Second Cell   |
| with some     |
| text.         |
 ---------------
 ---------------
| Third Cell    |
 ---------------

シナリオ2:

 ---------------
| First Cell    |
 ---------------
 ---------------
| Second Cell   |
| with some     |
| more text and |
| an unknown    |
| cell height.  | 
 ---------------
 ---------------
| Third Cell    |
 ---------------
28
WrightsCS

セルテキストにはUILabelを使用します。次に、sizeWithFont:constrainedToSize:を使用して、各セル内のUILabelの高さを計算できます。例えば:

#define PADDING 10.0f

- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = [self.items objectAtIndex:indexPath.row];
    CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)];

    return textSize.height + PADDING * 3;
}
34
Anh Do

解決策は非常に単純で、iOS 7以降で機能するはずです。StoryBoardのUITextView内のUITableViewCellScrolling Enabledオプションがオフオフになっていることを確認してください。

次に、UITableViewControllerのviewDidLoad()で、次のようにtableView.rowHeight = UITableViewAutomaticDimensiontableView.estimatedRowHeight > 0を設定します。

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 44.0
}

それでおしまい。 UITableViewCellの高さは、内側のUITextViewの高さに基づいて自動的に調整されます。

4
petrsyn

テキストビューのcontentInsetのようなものが含まれるため、テキストサイズを計算するときに考慮する必要があるため、かなり複雑なものです。 内部UITextViewに基づくUITableViewCellの高さ を計算するための学習と解決策をブログに書きました。投稿には、テーブルビュースタイルと自動回転の両方のユニバーサルアプリで機能するコードが含まれています。

2
dennisreimann