如何使用DTCoreText在UITableViewCell中显示图像

时间:2013-01-25 15:39:59

标签: uitableview lazy-loading

我在UITableViewCell中有DTAttributedTextContentView并尝试使用html(带图片)加载它,但找不到合适的方法来执行此操作。我在Demo中调查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大小。我找不到任何关于如何实现这个的文件。

如果您有更好的选择或解决方案,请告诉我。

1 个答案:

答案 0 :(得分:3)

我也很难让这个工作起来,没有太多关于此的信息,但我终于得到了它的工作。 当您DTAttributedTextCell将其DTAttributedTextContentView属性的委托设置为tableviewcontroller

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的子类来保存一个额外的属性,即在调用DTAttributedTextContentView时使用的对该单个单元格的DTLazyImageViewDelegate的引用。

然后在调用- (void)lazyImageView:(DTLazyImageView *)lazyImageView didChangeImageSize:(CGSize)size时,使用传递的lazyImageView变量并将其转换为子类以获取存储的DTAttributedTextContentView。使用示例中提供的相同方法,但只需将_textView.attributedTextContentView替换为您携带的DTAttributedTextContentView

还要确保像DemoSnippetsViewController一样制作单元格,如果你正在加载图像,你需要有可变高度单元格,你必须实现- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

Stricklands问题更新

我在大约一年内没有触及我的代码所以我对此不太确定。但这就是我认为正在发生的事情。我从不调用- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath,我只是实现它,并在重新加载单元格时调用它。什么时候重装?从我收集的内容中,我实现了懒惰图像视图的委托- (void)lazyImageView:(DTLazyImageView *)lazyImageView didChangeImageSize:(CGSize)size;因此,在从网上下载图像后,在该调用中我检查图像大小是否已更改并调用[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:]以使用小缓冲区传递新大小。