使用TextKit在UITextView中添加动态UIImage

17
我有一个包含多个图像帧和持续时间的UIImage,它是从一个动画GIF文件中拼接而成的。如果我在UIWebView中加载图像,它会按预期进行动画,但我想使用UITextView。显然的选择是使用TextKit与自定义NSLayoutManger和许多自定义NSAttributedString属性来实现各种绘制效果。我有一个单独的UITextView,我想为它提供一个NSAttributedString,其中包含需要内联显示的所有图像的NSTextAttachment。除了当我加载这些动画UIImages之一时,它们不会通过它们的帧进行动画外,一切都很好。你有关于如何完成这个任务的想法吗?我已经想出了一个理论上的选项:
  1. 为每个动画图像添加自定义定义的属性
  2. 当布局管理器开始绘制背景时,迭代该属性以查找附件的位置。
  3. 回调TextView以创建UIImageViews并用动画图像添加为子视图,并调用startAnimating
我还没有尝试过这个方法,但它相当令人困惑。我想知道是否有更好的选择。
总之:我想通过NSAttributedString中的NSTextAttachment在UITextView中动画显示UIImage,而不需要额外的UIImageView对象。您可以忽略先前使用UIWebView的事实。UIImage具有设置动画帧的属性(images,duration),我已经配置好了。如果我将其分配给UIImageView,则会进行动画,如果将其设置为NSTextAttachment,则不会进行动画。
感谢您的任何反馈。谢谢!

1
今天早上也在想同样的事情。 - yellottyellott
@pteofil 我无法截图,因为您不会知道该图像正在动画,它看起来只是一个静态图像。澄清一下:我想通过NSAttributedString中的NSTextAttachment在UITextView内部动画UIImage,而无需额外的UIImageView对象。您可以忽略此前使用UIWebView完成此操作的事实。UIImage具有设置动画帧的属性(图像、持续时间),我已经进行了配置。如果我将其分配给UIImageView,则会进行动画处理,如果我将其设置为NSTextAttachment,则不会进行动画处理。 - afrederick
1
我现在理解得更好了。但是你为了澄清而发表的评论最好能够整合到问题中,这样每个人都可以轻松地看到它。 - pteofil
如果你持有对NSTextAttachment对象的引用,并在延迟后手动更改image属性,那么你会看到任何变化吗?如果是这样,你可以子类化NSTextAttachment并重新创建动画行为。 - Robert
@Robert 是的,这是我考虑过的一个选项,使用NSTextAttachment子类和CADisplayLink,分析动画的UIImage并确定何时需要更新文本附件的图像属性。这似乎比将UIImageView子视图添加到文本视图中稍微不那么hacky。不过我会尝试一下,看看可行性如何。 - afrederick
显示剩余3条评论
1个回答

4
我认为这种行为是因为UITextView没有使用UIImageView子视图来显示附件。当我观察有和没有将NSTextAttachment添加到UITextView的视图层次结构时,我看不到任何新的视图(您可以使用Xcode中的View Debugging观察视图层次结构,或通过这样说:[[[UIApplication sharedApplication] keyWindow] recursiveDescription])。可以推测,UITextView直接绘制它的附件。

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


是的,这就是我在问题中提到的“理论选项”。这种方法相当不可靠,如果可能的话,我想避免使用它,因为它会很脆弱,并需要大量管理那些UIImageView子视图。我正在使用的UITextView包含在一个UICollectionViewCell中,因此单元格将必须管理它们的位置和生命周期。最初进行研究时,我做了你说的事情:我检查了文本视图的子视图,希望它嵌套了一些我可以动画化的图像视图,但是没有子视图,所有渲染都在CATiledLayer中完成。 - afrederick
如果TextView在CollectionView中,您需要以与TextView相同的方式管理ImageView的位置和生命周期。您可以在创建UITextView时创建UIImageView子视图,并将它们放置在didCompleteLayout中。如果TextView在CollectionView中,我假设您不使用TextView的滚动功能-如果是这种情况,您就不需要费心滚动ImageView。 - roop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接