带有TextKit的UITextView中的动画UIImage



我有一个UIImage,它包含多个图像帧和一个从动画GIF文件中剪切在一起的持续时间。如果我在UIWebView中加载图像,它将按预期设置动画,但我想使用UITextView。显而易见的选择是使用具有自定义NSLayoutManger和许多自定义NSAttributedString属性的TextKit来实现各种绘图效果。我有一个UITextView,我想给它一个包含NSTextAttachmentNSAttributedString,用于我需要内联显示的所有图像。它工作得很好,只是当我加载其中一个动画UIImages时,它们不会通过它们的帧设置动画。有没有想过如何做到这一点?我想出了一个理论选择:

  1. 为每个动画图像添加自定义定义的属性
  2. 当布局管理器开始绘制背景时,迭代该属性以定位附件的位置
  3. 回调到文本视图以创建具有动画图像的UIImageViews,添加为子视图,并调用startAnimating

我还没有尝试过,但它相当粗糙。我想知道是否有更好的选择。

总之:我想通过NSAttributedString中的NSTextAttachmentUITextView中动画化UIImage,而不需要额外的UIImageView对象。您可以忽略这样一个事实,即这是以前用UIWebView完成的。UIImage具有用于设置动画帧的属性(imagesduration),我目前已经配置了这些属性。如果我将其指定给UIImageView,它将设置动画;如果我将它设置为NSTextAttachment,则不设置动画。

如果有任何反馈,我将不胜感激。谢谢

我认为这种行为是因为UITextView不使用UIImageView子视图显示附件。当我观察在UITextView中添加和不添加NSTextAttachment的视图层次结构时,我看不到任何新视图(您可以使用Xcode中的视图调试来观察视图层次结构,或者说[[[UIApplication sharedApplication] keyWindow] recursiveDescription])。据推测,UITextView只是直接绘制其附件。

也就是说,我可以考虑包含可动画化附件的一种方法是,自己创建一个动画UIImageView作为UITextView的子视图,将其准确放置在NSLayoutManager放置NSTextAttachment的位置,并在UITextView滚动时滚动它。您可以通过调用boundingRectForGlyphRange:inTextContainer:(可能在layoutManager:didCompleteLayoutForTextContainer:atEnd:中)从NSLayoutManager获取NSTextAttachment的矩形。

最新更新