我在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
大小。我找不到任何关于如何实现这个的文件。
如果您有更好的选择或解决方案,请告诉我。
答案 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
我在大约一年内没有触及我的代码所以我对此不太确定。但这就是我认为正在发生的事情。我从不调用- (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:]
以使用小缓冲区传递新大小。