27

UITableViewCellメソッド内で when を取得するheightForRowAtIndexPath方法、つまり indexPath を指定する方法は?

(その後、作成したコンテンツ ビューにアクセスして、それらの高さを合計することができます)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // How to get the UITableViewCell associated with this indexPath?
}

ありがとう

編集: 実際、これを行う有効な方法は本当にありますか? NSLogいくつかのステートメントを入れるheightForRowAtIndexPathと、呼び出しの前に数回呼び出されたようです(セル内cellForRowAtIndexPathに設定した場所です)? UILabelsこの種は、機能しない手法を使用しようとする可能性があることを意味します。つまりheightForRowAtIndexPath、各セルで既に作成されているラベルにアクセスして高さを取得し、セル行全体の高さを合計することを望んでいました。まだセットアップされていない場合 (内cellForRowAtIndexPath)、私のアプローチは実際には機能しないと思いますか?

4

6 に答える 6

24

tableView 自体の代わりに、tableview のデリゲートを使用できます。

id cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];

ここで答えを確認してください

更新しました

新しい iOS バージョンでは、正しい自動制約を使用すると、セルの高さを計算するためにセルを参照する必要がなくなりました。

ここをチェック

https://www.raywenderlich.com/129059/self-sizing-table-view-cells

于 2014-03-31T09:28:33.850 に答える
19

この質問は意味がありません。

heightForRowAtIndexPath

セルはまだ作成されていません。tableView の仕組みは次のとおりです。

  1. TableView は、データソースにセクションの数を尋ねます。-numberOfSectionsInTableView
  2. 各セクションの行数をデータソースに問い合わせます (スクローラーの大きさなどを知るため)。-numberOfRowsInSection
  3. 表示されている各行のデリゲートの高さを尋ねます。細胞がどこに位置するかを知ること。- heightForRowAtIndexPath
  4. 最後に、指定されたインデックス パスに表示するセルを指定するようにデータ ソースに要求します。-cellForRowAtIndexPath

したがってheightForRowAtIndexPath、セルがまだ作成されていない可能性が高いため、からセルにアクセスすることはできません。


ただし、質問を誤解した場合は、次を試してください。

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
于 2013-11-28T15:27:17.933 に答える
14

明白な答えは電話cellForRowAtIndexPathすることですが、あなたはすでにそれにいくつかの問題があることを発見したかもしれません。まだ読んでいない場合は、この質問を参照してください:UITableViewflexible / dynamic heightForRowAtIndexPath

前回のプロジェクトでは、UICellのカスタムサブクラスを使用し、このようなメソッドを実装しました。次に、table:heightForRowAtIndexPath:(その行のコンテンツを検索した後)からこれを呼び出しました。

+ (CGFloat) heightOfContent: (NSString *)content
{
    CGFloat contentHeight = 
           [content sizeWithFont: DefaultContentLabelFont
               constrainedToSize: CGSizeMake( DefaultCellSize.width, DefaultContentLabelHeight * DefaultContentLabelNumberOfLines )
                   lineBreakMode: UILineBreakModeWordWrap].height;
    return contentHeight + DefaultCellPaddingHeight;
}
于 2011-03-10T02:40:35.073 に答える
4

table:heightForRowAtIndexPath:データ構造(テキスト、画像、複数行テキストなどの高さ)を使用して、行の正しい高さを計算することをお勧めします。

メソッドでコンポーネントの高さを変更します-(void) layoutSubviews

于 2011-03-10T02:52:11.933 に答える
1

セルにアクセスする場合は、タグを使用します。しかし、@ Jhaliyaが言ったように、セルの内容に基づいて高さを計算する方が良いです。セルの位置に関心がある場合は、スクロールビューを使用して、必要な場所にセルを自分で実装することをお勧めします。

于 2013-01-08T09:44:11.930 に答える
-19

iOS8の場合:

override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.estimatedRowHeight = 80
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }

また

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            return UITableViewAutomaticDimension

    }

しかし、iOS7の場合、キーは自動レイアウト後に高さを計算することです。

func calculateHeightForConfiguredSizingCell(cell: GSTableViewCell) -> CGFloat {
        cell.setNeedsLayout()
        cell.layoutIfNeeded()
        let height = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize).height + 1.0
        return height

    }

ノート:

1) 複数行のラベルがある場合は、忘れずにnumberOfLinesを 0 に設定してください。

2) 忘れないでlabel.preferredMaxLayoutWidth = CGRectGetWidth(tableView.bounds)

于 2011-03-10T02:35:26.027 に答える