iOS富文本手动刷新和异步替换网络图片

CSDN注册好几年一直没用过于是乎今天心血来潮写一篇技术交流贴,以供有需要的道友。

 

移动端iOS开发中,少不了遇到NSAttributedString(富文本字典集合)富文本形式进行图文混排。如果想替换富文本内部某个位置的图片,有一种方式是找到range,然后重新生成此段range的富文本,然后将总文本进行局部替换。此方式贫道觉得有些许难以确定具体替换的位置。还有一种方式是,可以通过遍历来获取内部各个段落文本字典。具体方法名是:

enumerateAttributesInRange: options:NSAttributedStringEnumerationReverse usingBlock:

 

是block我们知道,回调是异步执行的。加载网络图片也是异步执行的,这就导致问题

1、图片显示出来了,但是还是旧图片。

2、预先不知道图片的大小,但是NSTextAttachment是需要设定大小的,所以一开始就用的placeholder图片的大小,等图片下载完成候再更新NSTextAttachment的bounds,发现无效。

例子:

[[SDWebImageManager sharedManager] loadImageWithURL:[NSURL URLWithString:url] options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) 

{} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL)

{

        UIImage *linkImage = image;

        attachment.image = videoImage;

}];

 

但是你如果重新退出这个ViewController再进入的话,图片神奇般的重新显示了。所以十有八九是TextView没有刷新的缘故了。如果调用textView的setNeedsLayout是没有用的,这个方法的用途是用来刷新subView的,对于TextView中的内容布局是没有影响的。

 

 

重点:

我们要用到的是CoreText中的NSLayoutManager,先看一下我们要用到的方法:

[self.textView.layoutManager invalidateLayoutForCharacterRange:range actualCharacterRange:NULL];

 

苹果文档解释是:

定义 Invalidates the layout information for the glyphs mapped to the given range of characters.这个方法会调用下面的方法

1、imageForBounds:textContainer:characterIndex: will be called again.

2、attachmentBoundsForTextContainer:[…]Index: will be called again.

所以,我们只要在NSTextAttachment.image赋值或者bouds改变之后,调用该方法就可以刷新textView的布局,让图片大小正常显示出来了。

 

引用:点击打开链接

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值