使用TextKit在UITextView中动画UIImage

时间:2015-04-29 16:21:59

标签: ios uitextview textkit nslayoutmanager

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

  1. 为每个动画图像添加自定义属性
  2. 当布局管理器去绘制背景时,请迭代此属性以找到附件的位置。
  3. 回调文字视图以使用动画图片创建UIImageView,添加为子视图,然后致电startAnimating
  4. 我还没有尝试过这个,但它相当hacky。我想知道是否有更好的选择。

    总结:我想在UIImage内通过UITextViewNSTextAttachment内制作NSAttributedString动画,而不需要额外的UIImageView个对象。您可以忽略以前使用UIWebView完成的事实。 UIImage具有用于设置动画帧的属性(imagesduration),我目前已配置了这些帧。如果我将其分配给UIImageView动画,如果我将其设置为NSTextAttachment,则不会动画。

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

1 个答案:

答案 0 :(得分:2)

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

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