设置attributionText后,UITextView会做什么?

时间:2015-08-27 15:02:49

标签: ios uitextview uitextinput

我有一个UITextView,我正在添加一些自定义UI。此自定义UI根据UITextView中文本的位置进行布局。

我在UITextView上使用firstRectForRange方法(来自UITextInput)。此方法返回textView中指定文本范围的框架。

但是,在设置attributedText后,它无法正常工作。它需要最少的时间才能返回预期值。这段时间很可能是直到第一帧更新文本呈现并显示在屏幕上的时间。

我目前正在将自定义UI的代码包装到dispatch_async(dispatch_get_main_queue(), ...)块中,这会延迟执行,直到渲染帧为止(大约9毫秒)。

UITextView在设置referencedString和在屏幕上显示下一帧之间做了什么? 是否有更好的地方/方法要求我加入?
我有什么方法可以同步强制执行该操作吗?

我试过的事情: (在设置attributedText之后;在调用firstRectForRange之前)

  • setNeedsLayout之前致电layoutIfNeededfirstRectForRange
  • 致电drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)

1 个答案:

答案 0 :(得分:0)

您是否尝试从后台线程设置attributedText?我猜这就是问题所在。所有接口更改都应该在主线程上发生。根据个人经验,从背景线程中改变事物偶尔会起作用,通常比较慢,甚至更常不起作用。

如果是这种情况,dispatch_async正是您想要做的。它使得在后台处理数据变得非常容易,然后快速跳到主线程进行渲染。如果您想在设置字符串并找到firstRectForRange后进行更多处理,可以使用dispatch_sync使后台线程等待渲染,或者在渲染后调度回另一个线程。

至于UITextView在渲染attributesString时所做的事情,我真的不确定,但我猜这个细微的延迟来自系统弄清楚属性字符串应该如何看,以及如何它将被渲染。为了进一步理解,您可能需要深入了解CoreText,因为有很多事情发生在幕后。

编辑: 如果你是主线,那么我不认为你可以做的更多。使用dispatch_after可能比使用dispatch_async稍微清洁。

还有一个想法。您是否尝试过调用setNeedsDisplay?这通常会说明重绘自己的观点。