我有一个UIImage
,它包含多个图像帧和一个从动画GIF文件中剪切在一起的持续时间。如果我在UIWebView
中加载图像,它将按预期设置动画,但我想使用UITextView
。显而易见的选择是使用具有自定义NSLayoutManger
和许多自定义NSAttributedString
属性的TextKit来实现各种绘图效果。我有一个UITextView
,我想给它一个包含NSTextAttachment
的NSAttributedString
,用于我需要内联显示的所有图像。它工作得很好,只是当我加载其中一个动画UIImages
时,它们不会通过它们的帧设置动画。有没有想过如何做到这一点?我想出了一个理论选择:
- 为每个动画图像添加自定义定义的属性
- 当布局管理器开始绘制背景时,迭代该属性以定位附件的位置
- 回调到文本视图以创建具有动画图像的
UIImageView
s,添加为子视图,并调用startAnimating
我还没有尝试过,但它相当粗糙。我想知道是否有更好的选择。
总之:我想通过NSAttributedString
中的NSTextAttachment
在UITextView
中动画化UIImage
,而不需要额外的UIImageView
对象。您可以忽略这样一个事实,即这是以前用UIWebView
完成的。UIImage
具有用于设置动画帧的属性(images
、duration
),我目前已经配置了这些属性。如果我将其指定给UIImageView
,它将设置动画;如果我将它设置为NSTextAttachment
,则不设置动画。
如果有任何反馈,我将不胜感激。谢谢
我认为这种行为是因为UITextView
不使用UIImageView
子视图显示附件。当我观察在UITextView
中添加和不添加NSTextAttachment
的视图层次结构时,我看不到任何新视图(您可以使用Xcode中的视图调试来观察视图层次结构,或者说[[[UIApplication sharedApplication] keyWindow] recursiveDescription]
)。据推测,UITextView
只是直接绘制其附件。
也就是说,我可以考虑包含可动画化附件的一种方法是,自己创建一个动画UIImageView
作为UITextView
的子视图,将其准确放置在NSLayoutManager
放置NSTextAttachment
的位置,并在UITextView滚动时滚动它。您可以通过调用boundingRectForGlyphRange:inTextContainer:
(可能在layoutManager:didCompleteLayoutForTextContainer:atEnd:
中)从NSLayoutManager
获取NSTextAttachment
的矩形。