26

UITableViewカスタム セル (から継承UITableViewCell) が取り込まれた があります。各セルには、そのUIWebView内容に基づいて自動的にサイズ変更される が含まれています。UITableViewこれが問題です。コンテンツに基づいてセルの高さを変更するにはどうすればよいですか(変数webView)。

入力に使用される HTMLUIWebViewsは常に変化するフィードから解析されるため、ソリューションは動的でなければなりません。

UITableViewデリゲートメソッドを使用する必要があると感じていますheightForRowAtIndexPathが、その定義から:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ;//This needs to be variable
}

セルまたはその内容にアクセスできません。のセルの高さを変更できますcellForRowAtIndexPathか?

どんな助けも素晴らしいでしょう。ありがとう。

ノート

2年以上前にこの質問をしました。自動レイアウトの導入により、iOS7 に最適なソリューションを見つけることができます。

動的セル レイアウトと可変行高さのために UITableView で自動レイアウトを使用する

iOS8 では、この機能は SDK に組み込まれています。

4

12 に答える 12

29

これは通常、かなりうまく機能します。

目的 C:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

迅速:

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
    return UITableViewAutomaticDimension;
}
于 2014-06-17T19:20:43.063 に答える
20

動的な高さについて私が見つけた最善の方法は、事前に高さを計算し、それをある種のコレクション(おそらく配列)に格納することです。セルにほとんどテキストが含まれていると仮定すると-[NSString sizeWithFont:constrainedToSize:lineBreakMode:]、高さを計算してから戻ることができます。の対応する値heightForRowAtIndexPath:

コンテンツが絶えず変化している場合は、新しいデータが提供されたときに高さの配列を更新するメソッドを実装できます。

于 2012-04-23T20:02:33.117 に答える
4

iOS の動的な高さを持つセルの大きな問題は、セルが描画される前に、テーブル vc が各セルの高さを計算して返さなければならないことです。ただし、セルが描画される前は、フレームがないため幅がありません。セルの幅がわからないため、たとえば textLabel 内のテキストの量に基づいてセルの高さを変更する場合、これは問題を引き起こします。

私が見た一般的な解決策は、人々がセル幅の数値を定義することです。テーブルはプレーンまたはグループ化され、iOS 7 または iOS 6 スタイルを使用し、iPhone または iPad に表示され、横向きまたは縦向きモードなどで表示される可能性があるため、これは悪いアプローチです。

私は、iOS5+ と複数の向きの iPhone と iPad の両方をサポートする私の iOS アプリでこれらの問題に苦労しました。これを自動化し、View Controller からロジックを除外する便利な方法が必要でした。その結果、デフォルト セル (デフォルトおよび字幕スタイル) とカスタム セルをサポートする UITableViewController サブクラス (状態を保持できるようにするため) になりました。

GitHub ( https://github.com/danielsaidi/AutoSizeTableView )で取得できます。この問題にまだ苦しんでいるあなたの助けになれば幸いです。もしよろしければ、ご意見をお聞かせください。

于 2014-02-20T22:57:17.627 に答える
3

これは、Twitterからツイートを取得し、オフラインで読み取るためにCoreDataに保存するときに動的セルの高さに使用したコードです。

これは、セルとデータのコンテンツを取得する方法だけでなく、パディングを使用してUILabelをコンテンツに動的にサイズ変更する方法も示しています。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    Tweet *tweet = [self.fetchedResultsController objectAtIndexPath:indexPath];

    NSString* text = tweet.Text;

    TweetTableViewCell *cell = (TweetTableViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];

    //Set the maximum size
    CGSize maximumLabelSize = cell.tweetLabel.frame.size;
    CGPoint originalLocation = cell.tweetLabel.frame.origin;

    //Calculate the new size based on the text
    CGSize expectedLabelSize = [text sizeWithFont:cell.tweetLabel.font constrainedToSize:maximumLabelSize lineBreakMode:cell.tweetLabel.lineBreakMode];


    //Dynamically figure out the padding for the cell
    CGFloat topPadding = cell.tweetLabel.frame.origin.y - cell.frame.origin.y;


    CGFloat bottomOfLabel = cell.tweetLabel.frame.origin.y + cell.tweetLabel.frame.size.height;
    CGFloat bottomPadding = cell.frame.size.height - bottomOfLabel;


    CGFloat padding = topPadding + bottomPadding;


    CGFloat topPaddingForImage = cell.profileImage.frame.origin.y - cell.frame.origin.y;
    CGFloat minimumHeight = cell.profileImage.frame.size.height + topPaddingForImage + bottomPadding;

    //adjust to the new size
    cell.tweetLabel.frame = CGRectMake(originalLocation.x, originalLocation.y, cell.tweetLabel.frame.size.width, expectedLabelSize.height);


    CGFloat cellHeight = expectedLabelSize.height + padding;

    if (cellHeight < minimumHeight) {

        cellHeight = minimumHeight;
    }

    return cellHeight;
}
于 2012-04-23T20:02:55.257 に答える
2

また、そのようなアルゴリズムがあなたに合っていると思います:

1) cellForrowAtIndexPath で、読み込み用に Web ビューをアクティブにし、indexPath.row に等しいタグを付けます。

2) webViewDidFinishLoading では、セル内のコンテンツの高さを計算し、次のようなキーと値で辞書を作成します: key= indexPath.row value = height

3) [テーブルビューのリロードデータ] を呼び出す

4) [tableview cellForRowAtIndexPath:indexPath] で、対応するセルの適切な高さを設定します

于 2012-04-23T20:09:39.630 に答える
0

UILabel で非常に大きなテストを行いました。何よりもうまくいかないので、以下のように文字列のカテゴリを作成し、正確な高さを取得しました

- (CGFloat)heightStringWithEmojifontType:(UIFont *)uiFont ForWidth:(CGFloat)width {

// Get text
CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CFAttributedStringReplaceString (attrString, CFRangeMake(0, 0), (CFStringRef) self );
CFIndex stringLength = CFStringGetLength((CFStringRef) attrString);

// Change font
CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef) uiFont.fontName, uiFont.pointSize, NULL);
CFAttributedStringSetAttribute(attrString, CFRangeMake(0, stringLength), kCTFontAttributeName, ctFont);

// Calc the size
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CFRange fitRange;
CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(width, CGFLOAT_MAX), &fitRange);

CFRelease(ctFont);
CFRelease(framesetter);
CFRelease(attrString);

return frameSize.height + 10;}
于 2017-05-12T10:12:05.940 に答える