使用TextKit在UITextView中动画UIImage

afr*_*ick 16 nslayoutmanager uitextview ios textkit

我有一个UIImage包含多个图像帧和一个从动画GIF文件切片的持续时间.如果我将图像加载到UIWebView其中将按预期动画,但我想使用UITextView替代.显而易见的选择是使用带有自定义NSLayoutManger和许多自定义NSAttributedString属性的TextKit 来实现各种绘图效果.我有一个单一的UITextView,我想给一个NSAttributedString包含NSTextAttachments的所有图像我需要内联显示.它工作得很好,除了当我加载其中一个动画时UIImages,它们没有动画通过它们的帧.有关如何实现这一点的任何想法?我想出了一个理论选择:

  1. 对于每个动画图像,添加自定义属性
  2. 当布局管理器去绘制背景时,迭代此属性以定位附件的位置.
  3. 回调到文本视图以UIImageView使用动画图像创建s,添加为子视图并调用startAnimating

我还没有试过这个,但它相当hacky.我想知道是否有更好的选择.

总结:我想一个动画UIImageUITextView通过NSTextAttachment内部NSAttributedString而不需要额外的UIImageView对象.你可以忽略这个以前用a做的事实UIWebView.UIImage具有用于设置动画帧的属性(images,duration),我目前已配置.如果我将它分配给UIImageView它动画,如果我将其设置为a NSTextAttachment,则不动画.

我将不胜感激任何反馈.谢谢!

roo*_*oop 4

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

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