【问题标题】:Animated UIImage in UITextView with TextKitUITextView 中的动画 UIImage 与 TextKit
【发布时间】:2015-07-09 01:41:23
【问题描述】:

我有一个UIImage,其中包含多个图像帧和一个从动画 GIF 文件中分割出来的持续时间。如果我将图像加载到 UIWebView 中,它将按预期进行动画处理,但我想改用 UITextView。显而易见的选择是使用带有自定义NSLayoutManger 和许多自定义NSAttributedString 属性的TextKit 来实现各种绘图效果。我有一个UITextView,我想提供一个NSAttributedString,其中包含我需要内联显示的所有图像的NSTextAttachments。它工作正常,除了当我加载其中一个动画UIImages 时,它们不会通过它们的帧进行动画处理。关于如何做到这一点的任何想法?我想出了一个理论上的选择:

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

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

总而言之:我想通过NSTextAttachmentNSAttributedString 内为UITextView 内的UIImage 设置动画,而无需额外的UIImageView 对象。您可以忽略以前使用UIWebView 完成此操作的事实。 UIImage 具有用于设置动画帧的属性(imagesduration),我目前已经配置了这些属性。如果我将其分配给UIImageView,它会产生动画效果,如果我将其设置为NSTextAttachment,则不会产生动画效果。

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

【问题讨论】:

  • 今天早上想知道同样的事情。
  • 您能否提供一个屏幕截图,说明您尝试使用 UIImage 和 UITextView 复制它在 WebView 中的外观。这将有助于更好地对其进行可视化并提供答案。
  • @pteofil 我无法截屏,因为您不会知道图像是动画,它看起来就像一张静态图像。澄清一下:我想通过 NSAttributedString 中的 NSTextAttachment 为 UITextView 中的 UIImage 设置动画,而无需额外的 UIImageView 对象。您可以忽略以前使用 UIWebView 完成此操作的事实。 UIImage 具有用于设置动画帧的属性(图像、持续时间),我目前已经配置了这些属性。如果我将它分配给它动画的 UIImageView,如果我将它设置为 NSTextAttachment,则没有动画。
  • 我现在明白多了。但是您澄清的评论会更好地融入每个人都可以轻松看到的问题中。
  • 如果您持有对NSTextAttachment 对象的引用并在延迟后手动更改image 属性,您是否看到任何变化?如果是这样,您可以继承 NSTextAttachment 并重新创建动画行为。

标签: ios uitextview textkit nslayoutmanager


【解决方案1】:

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

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

【讨论】:

  • 是的,这是我在问题中谈到的“理论选项”。它相当老套,如果可能的话,我想避免这种方法,因为它很脆弱,需要对UIImageView 子视图进行大量额外管理。我正在使用的UITextView 包含在UICollectionViewCell 中,因此单元必须管理它们的位置和生命周期。最初研究时,我按照您所说的做了:我检查了文本视图的子视图,希望它嵌套了一些我可以制作动画的图像视图,但是没有子视图,所有渲染都在 CATiledLayer 内完成。
  • 如果文本视图在集合视图中,您必须以与文本视图相同的方式管理图像视图的位置和生命周期。您可以在创建 UITextView 时创建 UIImageView 子视图,并将它们放在 didCompleteLayout 中。如果 textview 在集合视图中,我认为您没有使用 textview 的滚动功能 - 如果是这种情况,您无需费心滚动图像视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2012-07-09
相关资源
最近更新 更多