0

私はDTAttributedTextContentViewUITableViewCell を持っていて、html (画像付き) でロードしようとしましたが、これを行う適切な方法が見つかりません。DemoTextViewController.m画像をロードするデモを調べました

- (void)lazyImageView:(DTLazyImageView *)lazyImageView didChangeImageSize:(CGSize)size {
    NSURL *url = lazyImageView.url;
    CGSize imageSize = size;

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"contentURL == %@", url];

    // update all attachments that matchin this URL (possibly multiple images with same size)
    for (DTTextAttachment *oneAttachment in [_textView.attributedTextContentView.layoutFrame textAttachmentsWithPredicate:pred])
    {
        oneAttachment.originalSize = imageSize;

        if (!CGSizeEqualToSize(imageSize, oneAttachment.displaySize))
        {
            oneAttachment.displaySize = imageSize;
        }
    }

    // redo layout
    // here we're layouting the entire string, might be more efficient to only relayout the paragraphs that contain these attachments
    [_textView.attributedTextContentView relayoutText];
}

しかし、これが私が試したUITableViewCellにどのように適用されるかはわかりません

- (void)lazyImageView:(DTLazyImageView *)lazyImageView didChangeImageSize:(CGSize)size {
    NSURL *url = lazyImageView.url;
    CGSize imageSize = size;

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"contentURL == %@", url];

    for (UITableViewCell *cell in self.tableView.visibleCells) {
        if ([cell isKindOfClass:[CommentCell class]]) {
            CommentCell *cc = (CommentCell *)cell;
            for (DTTextAttachment *oneAttachment in [cc.attributedTextContentView.layoutFrame textAttachmentsWithPredicate:pred])
            {
                oneAttachment.originalSize = imageSize;

                if (!CGSizeEqualToSize(imageSize, oneAttachment.displaySize))
                {
                    oneAttachment.displaySize = CGSizeMake(300, 100);
                }
            }
            [cc.attributedTextContentView relayoutText];
        }

    }

}

しかし、セルの高さが正しく表示されず、画像がサイズに合わせてDTAttributedTextContentViewサイズ変更されません。これを実装する方法のドキュメントが見つかりません。

より良い選択または解決策があれば教えてください。

4

1 に答える 1

3

私もこれを機能させるのに苦労しました。これに関する情報はあまりありませんが、最終的に機能するようになりました。セットをそのプロパティDTAttributedTextCellのデリゲートにして、テーブルビューコントローラーに設定するときDTAttributedTextContentView

cell.attributedTextContextView.delegate = self;

このメソッドを実装します。

- (UIView *)attributedTextContentView:(DTAttributedTextContentView *)attributedTextContentView viewForAttachment:(DTTextAttachment *)attachment frame:    (CGRect)frame{

    if([attachment isKindOfClass:[DTImageTextAttachment class]]){

       FVLazyImageView *imageView = [[FVLazyImageView alloc] initWithFrame:frame];
       imageView.contextView = attributedTextContentView;
       imageView.delegate = self;

       // url for deferred loading
       imageView.url = attachment.contentURL;
       return imageView;
   }
    return nil;
}

このメソッド内からDTLazyImageView、デリゲートを作成して設定します。が呼び出されたときに使用される、その個々のセルのDTLazyImageViewへの参照である追加のプロパティを保持するために、 のサブクラスを作成しました。DTAttributedTextContentViewDTLazyImageViewDelegate

次に、- (void)lazyImageView:(DTLazyImageView *)lazyImageView didChangeImageSize:(CGSize)sizeが呼び出されたときに、lazyImageView渡された変数を取得し、それをサブクラスにキャストして、DTAttributedTextContentView保存したものを取得します。_textView.attributedTextContentView例にあるのと同じ方法を使用しますが、DTAttributedTextContentViewを持ち越したに置き換えるだけです。

また、DemoSnippetsViewController で彼が行っているようにセルを作成してください。画像をロードする場合は、可変高さのセルが必要であり、実装する必要があります。- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

Stricklands に関する質問の更新

約 1 年間自分のコードに触れていないので、これについてはよくわかりません。しかし、ここで私は何が起こっていると思います。を呼び出すことはありません- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath。実装するだけで、セルがリロードされたときに呼び出されます。いつリロードされますか?私が収集したものから、遅延画像ビューのデリゲートを実装し- (void)lazyImageView:(DTLazyImageView *)lazyImageView didChangeImageSize:(CGSize)size; ます。画像がWebからダウンロードされた後、その呼び出しで画像サイズが変更されたかどうかを確認し、 を呼び出します[DTAttributedTextContentView relayoutText]。これにより、リロードが開始されると思います。

これが私の heightForRowAtIndexPath 実装です:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    DTAttributedTextCell *cell = (DTAttributedTextCell *)[self tableView:tableView preparedCellForIndexPath:indexPath];
    if([indexPath isEqual:self.selectedIndex]){
        return MAX([cell requiredRowHeightInTableView:tableView] + 40,120);
    }
    return MAX([cell requiredRowHeightInTableView:tableView], 80);
}

ダウンロードが完了し、更新が呼び出されると、 が呼び出され[DTAttributedTextCell requiredRowHeightInTableView:]、新しいサイズが小さなバッファーで渡されます。

于 2013-05-08T17:50:50.157 に答える